home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / jikes / src / java.g < prev    next >
Text File  |  1999-05-14  |  122KB  |  4,964 lines

  1. %options scopes,act,an=javaact.cpp,hn=javaact.h,em,tab,gp=c++,
  2. %options fp=java,escape=$,prefix=TK_,em,defer,output-size=125
  3. %options hblockb=\:,hblocke=:\
  4. %options nogoto-default
  5. %options single-productions
  6. %options la=2,names=max
  7.  
  8. -- This software is subject to the terms of the IBM Jikes Compiler
  9. -- License Agreement available at the following URL:
  10. -- http://www.ibm.com/research/jikes.
  11. -- Copyright (C) 1996, 1999, International Business Machines Corporation
  12. -- and others.  All Rights Reserved.
  13. -- You must accept the terms of that agreement to use this software.
  14.  
  15. ------------------------------------------------------------------------
  16. --
  17. --                               J A V A
  18. --
  19. -- This Java grammar is almost identical to the grammar defined in
  20. -- chapter 19 of the Java Language Specification manual together with
  21. -- the additional rules found in the 1.1 document. It is written here
  22. -- in JIKES PG format with semantic actions following each rule. In
  23. -- specifying the rules we enclosed all terminal symbols in single
  24. -- quotes so that they can be quickly distinguished from
  25. -- non-terminals. Optional symbols are suffixed with a question mark (?)
  26. -- and the rules expanding such definitions can be found at the end.
  27. --
  28. -- This grammar is totally faithful to the original rules except that
  29. -- some syntactic markers: PackageHeaderMarker, MethodHeaderMarker and
  30. -- BodyMarker, were added to allow the parser to skip certain irrelevant
  31. -- syntactic components when they are not needed.
  32. --
  33. -- The file javaact.h produced by JIKESPG from this file (java.g) contains a
  34. -- very readable definition of the grammar rules together with their
  35. -- associated semantic actions. That file is marked with appropriate
  36. -- location directives (automatically generated) which instructs the C++
  37. -- compiler to issue error messages in terms of this file (java.g).
  38. -- Therefore, though the user is encouraged to read javaact.h, no
  39. -- change should ever be made to that file. Instead, changes should
  40. -- always be made in this file and javaact.h should be regenerated
  41. -- using JIKESPG. 
  42. --
  43. ------------------------------------------------------------------------
  44.  
  45. $Define
  46.  
  47. --
  48. -- This macro generates a header for an action function consisting
  49. -- of the rule in question (commented) and a location directive.
  50. --
  51. $location
  52. /.
  53.  
  54. // 
  55. // Rule $rule_number:  $rule_text
  56. //
  57. #line $next_line "$input_file"./
  58.  
  59. --
  60. -- This macro is used to initialize the rule_action array
  61. -- to an unnamed function. A name is generated using the
  62. -- number of the rule in question.
  63. --
  64. $action
  65. /.
  66. #ifndef HEADERS
  67.     rule_action[$rule_number] = &Parser::Act$rule_number;
  68. #else
  69.     void Act$rule_number(void);
  70. #endif
  71. ./
  72.  
  73. --
  74. -- These macros are used to initialize the rule_action array
  75. -- to a specific named function.
  76. --
  77. $MakeArrayType
  78. /.
  79. #ifndef HEADERS
  80.     rule_action[$rule_number] = &Parser::MakeArrayType;
  81. #endif
  82. ./
  83.  
  84. $MakeSimpleName
  85. /.
  86. #ifndef HEADERS
  87.     rule_action[$rule_number] = &Parser::MakeSimpleName;
  88. #endif
  89. ./
  90.  
  91. $MakeFieldAccess
  92. /.
  93. #ifndef HEADERS
  94.     rule_action[$rule_number] = &Parser::MakeFieldAccess;
  95. #endif
  96. ./
  97.  
  98. $MakeQualifiedSuper
  99. /.
  100. #ifndef HEADERS
  101.     rule_action[$rule_number] = &Parser::MakeQualifiedSuper;
  102. #endif
  103. ./
  104.  
  105. $MakeQualifiedNew
  106. /.
  107. #ifndef HEADERS
  108.     rule_action[$rule_number] = &Parser::MakeQualifiedNew;
  109. #endif
  110. ./
  111.  
  112. $SetSym1ToSym2
  113. /.
  114. #ifndef HEADERS
  115.     rule_action[$rule_number] = &Parser::SetSym1ToSym2;
  116. #endif
  117. ./
  118.  
  119. $MakeEmptyStatement
  120. /.
  121. #ifndef HEADERS
  122.     rule_action[$rule_number] = &Parser::MakeEmptyStatement;
  123. #endif
  124. ./
  125.  
  126. $MakeLabeledStatement
  127. /.
  128. #ifndef HEADERS
  129.     rule_action[$rule_number] = &Parser::MakeLabeledStatement;
  130. #endif
  131. ./
  132.  
  133. $MakeExpressionStatement
  134. /.
  135. #ifndef HEADERS
  136.     rule_action[$rule_number] = &Parser::MakeExpressionStatement;
  137. #endif
  138. ./
  139.  
  140. $MakeIfThenElseStatement
  141. /.
  142. #ifndef HEADERS
  143.     rule_action[$rule_number] = &Parser::MakeIfThenElseStatement;
  144. #endif
  145. ./
  146.  
  147. $MakeWhileStatement
  148. /.
  149. #ifndef HEADERS
  150.     rule_action[$rule_number] = &Parser::MakeWhileStatement;
  151. #endif
  152. ./
  153.  
  154. $MakeForStatement
  155. /.
  156. #ifndef HEADERS
  157.     rule_action[$rule_number] = &Parser::MakeForStatement;
  158. #endif
  159. ./
  160.  
  161. $MakeArrayCreationExpression
  162. /.
  163. #ifndef HEADERS
  164.     rule_action[$rule_number] = &Parser::MakeArrayCreationExpression;
  165. #endif
  166. ./
  167.  
  168. $MakeSuperFieldAccess
  169. /.
  170. #ifndef HEADERS
  171.     rule_action[$rule_number] = &Parser::MakeSuperFieldAccess;
  172. #endif
  173. ./
  174.  
  175. $MakeSuperDoubleFieldAccess
  176. /.
  177. #ifndef HEADERS
  178.     rule_action[$rule_number] = &Parser::MakeSuperDoubleFieldAccess;
  179. #endif
  180. ./
  181.  
  182. $MakeArrayAccess
  183. /.
  184. #ifndef HEADERS
  185.     rule_action[$rule_number] = &Parser::MakeArrayAccess;
  186. #endif
  187. ./
  188.  
  189. $MakeCastExpression
  190. /.
  191. #ifndef HEADERS
  192.     rule_action[$rule_number] = &Parser::MakeCastExpression;
  193. #endif
  194. ./
  195.  
  196. -- 
  197. -- This macro is used to initialize the rule_action array
  198. -- to the NullAction function.
  199. --
  200. $NullAction
  201. /.
  202. #ifndef HEADERS
  203.     rule_action[$rule_number] = &Parser::NullAction;
  204. #endif
  205. ./
  206.  
  207. -- 
  208. -- This macro is used to initialize the rule_action array
  209. -- to the NoAction function.
  210. --
  211. $NoAction
  212. /.
  213. #ifndef HEADERS
  214.     rule_action[$rule_number] = &Parser::NoAction;
  215. #endif
  216. ./
  217.  
  218. -- 
  219. -- This macro generates a header for a named action function that is
  220. -- already defined and will be shared.
  221. --
  222. $shared_function
  223. /.
  224.  
  225. //
  226. // Rule $rule_number:  $rule_text./
  227.  
  228. -- 
  229. -- This macro generates a header for a rule that invokes the
  230. -- no_function routine.
  231. --
  232. $shared_NoAction
  233. /.
  234.  
  235. //
  236. // Rule $rule_number:  $rule_text
  237. //
  238. // void NoAction(void);
  239. //./
  240.  
  241. -- 
  242. -- This macro generates a header for a rule that invokes the
  243. -- null_function routine.
  244. --
  245. $shared_NullAction
  246. /.
  247.  
  248. //
  249. // Rule $rule_number:  $rule_text
  250. //
  251. // void NullAction(void);
  252. //./
  253.  
  254. $Terminals
  255.  
  256.     BodyMarker
  257.  
  258.     Identifier
  259.  
  260.     abstract boolean break byte case catch char class const
  261.     continue default do double else extends false final finally float
  262.     for goto if implements import instanceof int
  263.     interface long native new null package private
  264.     protected public return short static strictfp super switch
  265.     synchronized this throw throws transient true try void
  266.     volatile while
  267.  
  268.     IntegerLiteral
  269.     LongLiteral
  270.     FloatingPointLiteral
  271.     DoubleLiteral
  272.     CharacterLiteral
  273.     StringLiteral
  274.  
  275.     PLUS_PLUS
  276.     MINUS_MINUS
  277.     EQUAL_EQUAL
  278.     LESS_EQUAL
  279.     GREATER_EQUAL
  280.     NOT_EQUAL
  281.     LEFT_SHIFT
  282.     RIGHT_SHIFT
  283.     UNSIGNED_RIGHT_SHIFT
  284.     PLUS_EQUAL
  285.     MINUS_EQUAL
  286.     MULTIPLY_EQUAL
  287.     DIVIDE_EQUAL
  288.     AND_EQUAL
  289.     OR_EQUAL
  290.     XOR_EQUAL
  291.     REMAINDER_EQUAL
  292.     LEFT_SHIFT_EQUAL
  293.     RIGHT_SHIFT_EQUAL
  294.     UNSIGNED_RIGHT_SHIFT_EQUAL
  295.     OR_OR
  296.     AND_AND
  297.     PLUS
  298.     MINUS
  299.     NOT
  300.     REMAINDER
  301.     XOR
  302.     AND
  303.     MULTIPLY
  304.     OR
  305.     TWIDDLE
  306.     DIVIDE
  307.     GREATER
  308.     LESS
  309.     LPAREN
  310.     RPAREN
  311.     LBRACE
  312.     RBRACE
  313.     LBRACKET
  314.     RBRACKET
  315.     SEMICOLON
  316.     QUESTION
  317.     COLON
  318.     COMMA
  319.     DOT
  320.     EQUAL
  321.  
  322.     ERROR
  323.     EOF
  324.     EOL
  325.  
  326. $Alias
  327.  
  328.     '++'   ::= PLUS_PLUS
  329.     '--'   ::= MINUS_MINUS
  330.     '=='   ::= EQUAL_EQUAL
  331.     '<='   ::= LESS_EQUAL
  332.     '>='   ::= GREATER_EQUAL
  333.     '!='   ::= NOT_EQUAL
  334.     '<<'   ::= LEFT_SHIFT
  335.     '>>'   ::= RIGHT_SHIFT
  336.     '>>>'  ::= UNSIGNED_RIGHT_SHIFT
  337.     '+='   ::= PLUS_EQUAL
  338.     '-='   ::= MINUS_EQUAL
  339.     '*='   ::= MULTIPLY_EQUAL
  340.     '/='   ::= DIVIDE_EQUAL
  341.     '&='   ::= AND_EQUAL
  342.     '|='   ::= OR_EQUAL
  343.     '^='   ::= XOR_EQUAL
  344.     '%='   ::= REMAINDER_EQUAL
  345.     '<<='  ::= LEFT_SHIFT_EQUAL
  346.     '>>='  ::= RIGHT_SHIFT_EQUAL
  347.     '>>>=' ::= UNSIGNED_RIGHT_SHIFT_EQUAL
  348.     '||'   ::= OR_OR
  349.     '&&'   ::= AND_AND
  350.  
  351.     '+'    ::= PLUS
  352.     '-'    ::= MINUS
  353.     '!'    ::= NOT
  354.     '%'    ::= REMAINDER
  355.     '^'    ::= XOR
  356.     '&'    ::= AND
  357.     '*'    ::= MULTIPLY
  358.     '|'    ::= OR
  359.     '~'    ::= TWIDDLE
  360.     '/'    ::= DIVIDE
  361.     '>'    ::= GREATER
  362.     '<'    ::= LESS
  363.     '('    ::= LPAREN
  364.     ')'    ::= RPAREN
  365.     '{'    ::= LBRACE
  366.     '}'    ::= RBRACE
  367.     '['    ::= LBRACKET
  368.     ']'    ::= RBRACKET
  369.     ';'    ::= SEMICOLON
  370.     '?'    ::= QUESTION
  371.     ':'    ::= COLON
  372.     ','    ::= COMMA
  373.     '.'    ::= DOT
  374.     '='    ::= EQUAL
  375.  
  376.     $EOF   ::= EOF
  377.     $ERROR ::= ERROR
  378.  
  379.     $EOL   ::= ;
  380.  
  381. $Start
  382.  
  383.     Goal
  384.  
  385. $Rules
  386.  
  387. \:
  388. //
  389. // This software is subject to the terms of the IBM Jikes Compiler Open
  390. // Source License Agreement available at the following URL:
  391. // http://www.ibm.com/research/jikes.
  392. // Copyright (C) 1996, 1998, International Business Machines Corporation
  393. // and others.  All Rights Reserved.
  394. // You must accept the terms of that agreement to use this software.
  395. //
  396.  
  397. #ifndef HEADERS
  398. void Parser::InitRuleAction()
  399. {
  400.     rule_action[0] = &Parser::BadAction;
  401. #else
  402.     void BadAction(void);
  403.     void NoAction(void);
  404.     void NullAction(void);
  405.     void MakeArrayType(void);
  406.     void MakeSimpleName(void);
  407.     void MakeFieldAccess(void);
  408.     void MakeQualifiedSuper(void);
  409.     void MakeQualifiedNew(void);
  410.     void SetSym1ToSym2(void);
  411.     void MakeEmptyStatement(void);
  412.     void MakeLabeledStatement(void);
  413.     void MakeExpressionStatement(void);
  414.     void MakeIfThenElseStatement(void);
  415.     void MakeWhileStatement(void);
  416.     void MakeForStatement(void);
  417.     void MakeArrayCreationExpression(void);
  418.     void MakeSuperFieldAccess(void);
  419.     void MakeSuperDoubleFieldAccess(void);
  420.     void MakeArrayAccess(void);
  421.     void MakeCastExpression(void);
  422. #endif
  423.  
  424. :\
  425.  
  426. /.#line $next_line "$input_file"
  427. //
  428. // This software is subject to the terms of the IBM Jikes Compiler Open
  429. // Source License Agreement available at the following URL:
  430. // http://www.ibm.com/research/jikes.
  431. // Copyright (C) 1996, 1998, International Business Machines Corporation
  432. // and others.  All Rights Reserved.
  433. // You must accept the terms of that agreement to use this software.
  434. //
  435.  
  436. #include "config.h"
  437. #include "parser.h"
  438. #include "ast.h"
  439.  
  440. #undef HEADERS
  441. #include "javaact.h"
  442.  
  443. //****************************************************************************//
  444. //****************************************************************************//
  445. //*                                                                          *//
  446. //* Below, we show each rule of the Java grammar together with the semantic  *//
  447. //* action that is invoked when the parser performs a reduction by that rule.*//
  448. //*                                                                          *//
  449. //****************************************************************************//
  450. //****************************************************************************//
  451.  
  452. ./
  453.  
  454. --18.2 Productions from 2.3: The syntactic Grammar
  455.  
  456. Goal -> CompilationUnit
  457. \:$NoAction:\
  458. /.$location
  459. //
  460. // Given a rule of the form A ::= x1 x2 ... xn        n >= 1
  461. //
  462. // Do nothing - Whatever Ast was produced for x1 is inherited by A.
  463. //
  464. void Parser::BadAction(void) { assert(0); }
  465. void Parser::NoAction(void) {}
  466. ./
  467.  
  468. Goal ::= BodyMarker ConstructorBody
  469. \:$action:\
  470. /.$location
  471. //
  472. // This rule was added to allow the parser to recognize the body of a
  473. // funtion (constructor or method, as the definition of the body of a
  474. // method is subsumed by the definition of the body of a constructor)
  475. // out of context. Note that the artificial terminal BodyMarker is
  476. // added here to prevent an ordinary parse from accepting a body as
  477. // a valid input - i.e., to recognize a body out-of-context, the
  478. // BodyMarker terminal must be inserted in front of the input stream
  479. // containing the body in question.
  480. //
  481. void Parser::Act$rule_number(void)
  482. {
  483.     Sym(1) = Sym(2);
  484. }
  485. ./
  486.  
  487.  
  488. --18.3 Productions from 3: Lexical Structure
  489. --
  490. -- Expand the definition IntegerLiteral and BooleanLiteral
  491. --
  492.  
  493. Literal ::= IntegerLiteral
  494. \:$action:\
  495. /.$location
  496. void Parser::Act$rule_number(void)
  497. {
  498.     Sym(1) = ast_pool -> NewIntegerLiteral(Token(1));
  499. }
  500. ./
  501.  
  502. Literal ::= LongLiteral
  503. \:$action:\
  504. /.$location
  505. void Parser::Act$rule_number(void)
  506. {
  507.     Sym(1) = ast_pool -> NewLongLiteral(Token(1));
  508. }
  509. ./
  510.  
  511. Literal ::= FloatingPointLiteral
  512. \:$action:\
  513. /.$location
  514. void Parser::Act$rule_number(void)
  515. {
  516.     Sym(1) = ast_pool -> NewFloatingPointLiteral(Token(1));
  517. }
  518. ./
  519.  
  520. Literal ::= DoubleLiteral
  521. \:$action:\
  522. /.$location
  523. void Parser::Act$rule_number(void)
  524. {
  525.     Sym(1) = ast_pool -> NewDoubleLiteral(Token(1));
  526. }
  527. ./
  528.  
  529. Literal -> BooleanLiteral
  530. \:$NoAction:\
  531. /.$shared_NoAction./
  532.  
  533. Literal ::= CharacterLiteral
  534. \:$action:\
  535. /.$location
  536. void Parser::Act$rule_number(void)
  537. {
  538.     Sym(1) = ast_pool -> NewCharacterLiteral(Token(1));
  539. }
  540. ./
  541.  
  542. Literal ::= StringLiteral
  543. \:$action:\
  544. /.$location
  545. void Parser::Act$rule_number(void)
  546. {
  547.     Sym(1) = ast_pool -> NewStringLiteral(Token(1));
  548. }
  549. ./
  550.  
  551. Literal ::= null
  552. \:$action:\
  553. /.$location
  554. void Parser::Act$rule_number(void)
  555. {
  556.     Sym(1) = ast_pool -> NewNullLiteral(Token(1));
  557. }
  558. ./
  559.  
  560. BooleanLiteral ::= true
  561. \:$action:\
  562. /.$location
  563. void Parser::Act$rule_number(void)
  564. {
  565.     Sym(1) = ast_pool -> NewTrueLiteral(Token(1));
  566. }
  567. ./
  568.  
  569. BooleanLiteral ::= false
  570. \:$action:\
  571. /.$location
  572. void Parser::Act$rule_number(void)
  573. {
  574.     Sym(1) = ast_pool -> NewFalseLiteral(Token(1));
  575. }
  576. ./
  577.  
  578. --18.4 Productions from 4: Types, Values and Variables
  579.  
  580. Type -> PrimitiveType
  581. \:$NoAction:\
  582. /.$shared_NoAction./
  583.  
  584. Type -> ReferenceType
  585. \:$NoAction:\
  586. /.$shared_NoAction./
  587.  
  588. PrimitiveType -> NumericType
  589. \:$NoAction:\
  590. /.$shared_NoAction./
  591.  
  592. PrimitiveType ::= 'boolean'
  593. \:$action:\
  594. /.$location
  595. void Parser::Act$rule_number(void)
  596. {
  597.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::BOOLEAN, Token(1));
  598. }
  599. ./
  600.  
  601. NumericType -> IntegralType
  602. \:$NoAction:\
  603. /.$shared_NoAction./
  604.  
  605. NumericType -> FloatingPointType
  606. \:$NoAction:\
  607. /.$shared_NoAction./
  608.  
  609. IntegralType ::= 'byte'
  610. \:$action:\
  611. /.$location
  612. void Parser::Act$rule_number(void)
  613. {
  614.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::BYTE, Token(1));
  615. }
  616. ./
  617.  
  618. IntegralType ::= 'short'
  619. \:$action:\
  620. /.$location
  621. void Parser::Act$rule_number(void)
  622. {
  623.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::SHORT, Token(1));
  624. }
  625. ./
  626.  
  627. IntegralType ::= 'int'
  628. \:$action:\
  629. /.$location
  630. void Parser::Act$rule_number(void)
  631. {
  632.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::INT, Token(1));
  633. }
  634. ./
  635.  
  636. IntegralType ::= 'long'
  637. \:$action:\
  638. /.$location
  639. void Parser::Act$rule_number(void)
  640. {
  641.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::LONG, Token(1));
  642. }
  643. ./
  644.  
  645. IntegralType ::= 'char'
  646. \:$action:\
  647. /.$location
  648. void Parser::Act$rule_number(void)
  649. {
  650.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::CHAR, Token(1));
  651. }
  652. ./
  653.  
  654. FloatingPointType ::= 'float'
  655. \:$action:\
  656. /.$location
  657. void Parser::Act$rule_number(void)
  658. {
  659.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::FLOAT, Token(1));
  660. }
  661. ./
  662.  
  663. FloatingPointType ::= 'double'
  664. \:$action:\
  665. /.$location
  666. void Parser::Act$rule_number(void)
  667. {
  668.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::DOUBLE, Token(1));
  669. }
  670. ./
  671.  
  672. ReferenceType -> ClassOrInterfaceType
  673. \:$NoAction:\
  674. /.$shared_NoAction./
  675.  
  676. ReferenceType -> ArrayType
  677. \:$NoAction:\
  678. /.$shared_NoAction./
  679.  
  680. ClassOrInterfaceType -> Name
  681. \:$NoAction:\
  682. /.$shared_NoAction./
  683.  
  684. --
  685. -- These rules have been rewritten to avoid some conflicts introduced
  686. -- by adding the 1.1 features
  687. --
  688. -- ArrayType ::= PrimitiveType '[' ']'
  689. -- ArrayType ::= Name '[' ']'
  690. -- ArrayType ::= ArrayType '[' ']'
  691. --
  692. ArrayType ::= PrimitiveType Dims
  693. \:$MakeArrayType:\
  694. /.$location
  695. void Parser::MakeArrayType(void)
  696. {
  697.     AstArrayType *p = ast_pool -> NewArrayType();
  698.     p -> type     = Sym(1);
  699.     //
  700.     // The list of modifiers is guaranteed not empty
  701.     //
  702.     {   
  703.         AstListNode *tail = (AstListNode *) Sym(2);
  704.         p -> AllocateBrackets(tail -> index + 1);
  705.         AstListNode *root = tail;
  706.         do
  707.         {
  708.             root = root -> next;
  709.             p -> AddBrackets((AstBrackets *) root -> element);
  710.         } while(root != tail);
  711.         FreeCircularList(tail);
  712.     }
  713.     Sym(1) = p;
  714. }
  715. ./
  716.  
  717. ArrayType ::= Name Dims
  718. \:$MakeArrayType:\
  719. /.$shared_function 
  720. //
  721. // void MakeArrayType(void);
  722. //./
  723.  
  724. ClassType -> ClassOrInterfaceType
  725. \:$NoAction:\
  726. /.$shared_NoAction./
  727.  
  728. InterfaceType -> ClassOrInterfaceType
  729. \:$NoAction:\
  730. /.$shared_NoAction./
  731.  
  732. --18.5 Productions from 6: Names
  733.  
  734. Name -> SimpleName
  735. \:$NoAction:\
  736. /.$shared_NoAction./
  737.  
  738. Name -> QualifiedName
  739. \:$NoAction:\
  740. /.$shared_NoAction./
  741.  
  742. SimpleName ::= 'Identifier'
  743. \:$MakeSimpleName:\
  744. /.$location
  745. void Parser::MakeSimpleName(void)
  746. {
  747.     Sym(1) = ast_pool -> NewSimpleName(Token(1));
  748. }
  749. ./
  750.  
  751. QualifiedName ::= Name '.' 'Identifier'
  752. \:$MakeFieldAccess:\
  753. /.$location
  754. void Parser::MakeFieldAccess(void)
  755.     AstFieldAccess *p = ast_pool -> NewFieldAccess();
  756.     p -> base = (AstExpression *) Sym(1);
  757.     p -> dot_token = Token(2);
  758.     p -> identifier_token = Token(3);
  759.     Sym(1) = p;
  760. }
  761. ./
  762.  
  763. --18.6 Productions from 7: Packages
  764.  
  765. CompilationUnit ::= PackageDeclarationopt ImportDeclarationsopt TypeDeclarationsopt
  766. \:$action:\
  767. /.$location
  768. void Parser::Act$rule_number(void)
  769. {
  770.     AstCompilationUnit *p = ast_pool -> NewCompilationUnit();
  771.     p -> package_declaration_opt = (AstPackageDeclaration *) Sym(1);
  772.     if (Sym(2) != NULL)
  773.     {
  774.         AstListNode *tail = (AstListNode *) Sym(2);
  775.         p -> AllocateImportDeclarations(tail -> index + 1);
  776.         AstListNode *root = tail;
  777.         do
  778.         {
  779.             root = root -> next;
  780.             p -> AddImportDeclaration((AstImportDeclaration *) root -> element);
  781.         } while(root != tail);
  782.         FreeCircularList(tail);
  783.     }
  784.     if (Sym(3) != NULL)
  785.     {
  786.         AstListNode *tail = (AstListNode *) Sym(3);
  787.         p -> AllocateTypeDeclarations(tail -> index + 1);
  788.         AstListNode *root = tail;
  789.         do
  790.         {
  791.             root = root -> next;
  792.             p -> AddTypeDeclaration(root -> element);
  793.         } while(root != tail);
  794.         FreeCircularList(tail);
  795.     }
  796.     Sym(1) = p;
  797. }
  798. ./
  799.  
  800. ImportDeclarations ::= ImportDeclaration
  801. \:$action:\
  802. /.$location
  803. //
  804. // Note that the list is circular so as to preserve the order of the elements
  805. //
  806. void Parser::Act$rule_number(void)
  807. {
  808.     AstListNode *p = AllocateListNode();
  809.     p -> next = p;
  810.     p -> element = Sym(1);
  811.     p -> index = 0;
  812.  
  813.     Sym(1) = p;
  814. }
  815. ./
  816.  
  817. ImportDeclarations ::= ImportDeclarations ImportDeclaration
  818. \:$action:\
  819. /.$location
  820. //
  821. // Note that the list is circular so as to preserve the order of the elements
  822. //
  823. void Parser::Act$rule_number(void)
  824. {
  825.     AstListNode *tail = (AstListNode *) Sym(1);
  826.  
  827.     AstListNode *p = AllocateListNode();
  828.     p -> element = Sym(2);
  829.     p -> index = tail -> index + 1;
  830.  
  831.     p -> next = tail -> next;
  832.     tail -> next = p;
  833.  
  834.     Sym(1) = p;
  835. }
  836. ./
  837.  
  838. TypeDeclarations ::= TypeDeclaration
  839. \:$action:\
  840. /.$location
  841. //
  842. // Note that the list is circular so as to preserve the order of the elements
  843. //
  844. void Parser::Act$rule_number(void)
  845. {
  846.     AstListNode *p = AllocateListNode();
  847.     p -> next = p;
  848.     p -> element = Sym(1);
  849.     p -> index = 0;
  850.  
  851.     Sym(1) = p;
  852. }
  853. ./
  854.  
  855. TypeDeclarations ::= TypeDeclarations TypeDeclaration
  856. \:$action:\
  857. /.$location
  858. //
  859. // Note that the list is circular so as to preserve the order of the elements
  860. //
  861. void Parser::Act$rule_number(void)
  862. {
  863.     AstListNode *tail = (AstListNode *) Sym(1);
  864.  
  865.     AstListNode *p = AllocateListNode();
  866.     p -> element = Sym(2);
  867.     p -> index = tail -> index + 1;
  868.  
  869.     p -> next = tail -> next;
  870.     tail -> next = p;
  871.  
  872.     Sym(1) = p;
  873. }
  874. ./
  875.  
  876. PackageDeclaration ::= 'package' Name PackageHeaderMarker ';'
  877. \:$action:\
  878. /.$location
  879. void Parser::Act$rule_number(void)
  880. {
  881.     AstPackageDeclaration *p = ast_pool -> NewPackageDeclaration();
  882.     p -> package_token   = Token(1);
  883.     p -> name            = (AstExpression *) Sym(2);
  884.     p -> semicolon_token = Token(3);
  885.     Sym(1) = p;
  886. }
  887. ./
  888.  
  889. ImportDeclaration -> SingleTypeImportDeclaration
  890. \:$NoAction:\
  891. /.$shared_NoAction./
  892.  
  893. ImportDeclaration -> TypeImportOnDemandDeclaration
  894. \:$NoAction:\
  895. /.$shared_NoAction./
  896.  
  897. SingleTypeImportDeclaration ::= 'import' Name ';'
  898. \:$action:\
  899. /.$location
  900. void Parser::Act$rule_number(void)
  901. {
  902.     AstImportDeclaration *p = ast_pool -> NewImportDeclaration();
  903.     p -> import_token    = Token(1);
  904.     p -> name            = (AstExpression *) Sym(2);
  905.     p -> star_token_opt  = 0;
  906.     p -> semicolon_token = Token(3);
  907.     Sym(1) = p;
  908. }
  909. ./
  910.  
  911. TypeImportOnDemandDeclaration ::= 'import' Name '.' '*' ';'
  912. \:$action:\
  913. /.$location
  914. void Parser::Act$rule_number(void)
  915. {
  916.     AstImportDeclaration *p = ast_pool -> NewImportDeclaration();
  917.     p -> import_token         = Token(1);
  918.     p -> name                 = (AstExpression *) Sym(2);
  919.     p -> star_token_opt       = Token(4);
  920.     p -> semicolon_token      = Token(5);
  921.     Sym(1) = p;
  922. }
  923. ./
  924.  
  925. TypeDeclaration -> ClassDeclaration
  926. \:$NoAction:\
  927. /.$shared_NoAction./
  928.  
  929. TypeDeclaration -> InterfaceDeclaration
  930. \:$NoAction:\
  931. /.$shared_NoAction./
  932.  
  933. TypeDeclaration ::= ';'
  934. \:$action:\
  935. /.$location
  936. void Parser::Act$rule_number(void)
  937. {
  938.     Sym(1) = ast_pool -> NewEmptyDeclaration(Token(1));
  939. }
  940. ./
  941.  
  942. --18.7 Only in the LALR(1) Grammar
  943.  
  944. Modifiers ::= Modifier
  945. \:$action:\
  946. /.$location
  947. //
  948. // Note that the list is circular so as to preserve the order of the elements
  949. //
  950. void Parser::Act$rule_number(void)
  951. {
  952.     AstListNode *p = AllocateListNode();
  953.     p -> next = p;
  954.     p -> element = Sym(1);
  955.     p -> index = 0;
  956.  
  957.     Sym(1) = p;
  958. }
  959. ./
  960.  
  961. Modifiers ::= Modifiers Modifier
  962. \:$action:\
  963. /.$location
  964. //
  965. // Note that the list is circular so as to preserve the order of the elements
  966. //
  967. void Parser::Act$rule_number(void)
  968. {
  969.     AstListNode *tail = (AstListNode *) Sym(1);
  970.  
  971.     AstListNode *p = AllocateListNode();
  972.     p -> element = Sym(2);
  973.     p -> index = tail -> index + 1;
  974.  
  975.     p -> next = tail -> next;
  976.     tail -> next = p;
  977.  
  978.     Sym(1) = p;
  979. }
  980. ./
  981.  
  982. Modifier ::= 'public'
  983. \:$action:\
  984. /.$location
  985. void Parser::Act$rule_number(void)
  986. {
  987.     Sym(1) = ast_pool -> NewModifier(Ast::PUBLIC, Token(1));
  988. }
  989. ./
  990.  
  991. Modifier ::= 'protected'
  992. \:$action:\
  993. /.$location
  994. void Parser::Act$rule_number(void)
  995. {
  996.     Sym(1) = ast_pool -> NewModifier(Ast::PROTECTED, Token(1));
  997. }
  998. ./
  999.  
  1000. Modifier ::= 'private'
  1001. \:$action:\
  1002. /.$location
  1003. void Parser::Act$rule_number(void)
  1004. {
  1005.     Sym(1) = ast_pool -> NewModifier(Ast::PRIVATE, Token(1));
  1006. }
  1007. ./
  1008.  
  1009. Modifier ::= 'static'
  1010. \:$action:\
  1011. /.$location
  1012. void Parser::Act$rule_number(void)
  1013. {
  1014.     Sym(1) = ast_pool -> NewModifier(Ast::STATIC, Token(1));
  1015. }
  1016. ./
  1017.  
  1018. Modifier ::= 'abstract'
  1019. \:$action:\
  1020. /.$location
  1021. void Parser::Act$rule_number(void)
  1022. {
  1023.     Sym(1) = ast_pool -> NewModifier(Ast::ABSTRACT, Token(1));
  1024. }
  1025. ./
  1026.  
  1027. Modifier ::= 'final'
  1028. \:$action:\
  1029. /.$location
  1030. void Parser::Act$rule_number(void)
  1031. {
  1032.     Sym(1) = ast_pool -> NewModifier(Ast::FINAL, Token(1));
  1033. }
  1034. ./
  1035.  
  1036. Modifier ::= 'native'
  1037. \:$action:\
  1038. /.$location
  1039. void Parser::Act$rule_number(void)
  1040. {
  1041.     Sym(1) = ast_pool -> NewModifier(Ast::NATIVE, Token(1));
  1042. }
  1043. ./
  1044.  
  1045. Modifier ::= 'strictfp'
  1046. \:$action:\
  1047. /.$location
  1048. void Parser::Act$rule_number(void)
  1049. {
  1050.     Sym(1) = ast_pool -> NewModifier(Ast::STRICTFP, Token(1));
  1051. }
  1052. ./
  1053.  
  1054. Modifier ::= 'synchronized'
  1055. \:$action:\
  1056. /.$location
  1057. void Parser::Act$rule_number(void)
  1058. {
  1059.     Sym(1) = ast_pool -> NewModifier(Ast::SYNCHRONIZED, Token(1));
  1060. }
  1061. ./
  1062.  
  1063. Modifier ::= 'transient'
  1064. \:$action:\
  1065. /.$location
  1066. void Parser::Act$rule_number(void)
  1067. {
  1068.     Sym(1) = ast_pool -> NewModifier(Ast::TRANSIENT, Token(1));
  1069. }
  1070. ./
  1071.  
  1072. Modifier ::= 'volatile'
  1073. \:$action:\
  1074. /.$location
  1075. void Parser::Act$rule_number(void)
  1076. {
  1077.     Sym(1) = ast_pool -> NewModifier(Ast::VOLATILE, Token(1));
  1078. }
  1079. ./
  1080.  
  1081. --18.8 Productions from 8: Class Declarations
  1082. --ClassModifier ::=
  1083. --      'abstract'
  1084. --    | 'final'
  1085. --    | 'public'
  1086. --18.8.1 Productions from 8.1: Class Declarations
  1087.  
  1088. ClassDeclaration ::= Modifiersopt 'class' 'Identifier' Superopt Interfacesopt ClassBody
  1089. \:$action:\
  1090. /.$location
  1091. void Parser::Act$rule_number(void)
  1092. {
  1093.     AstClassDeclaration *p = ast_pool -> NewClassDeclaration();
  1094.     if (Sym(1) != NULL)
  1095.     {
  1096.         AstListNode *tail = (AstListNode *) Sym(1);
  1097.         p -> AllocateClassModifiers(tail -> index + 1);
  1098.         AstListNode *root = tail;
  1099.         do
  1100.         {
  1101.             root = root -> next;
  1102.             p -> AddClassModifier((AstModifier *) root -> element);
  1103.         } while(root != tail);
  1104.         FreeCircularList(tail);
  1105.     }
  1106.     p -> class_token          = Token(2);
  1107.     p -> identifier_token     = Token(3);
  1108.     p -> super_opt            = (AstExpression *) Sym(4);
  1109.     if (Sym(5) != NULL)
  1110.     {
  1111.         AstListNode *tail = (AstListNode *) Sym(5);
  1112.         p -> AllocateInterfaces(tail -> index + 1);
  1113.         AstListNode *root = tail;
  1114.         do
  1115.         {
  1116.             root = root -> next;
  1117.             p -> AddInterface((AstExpression *) root -> element);
  1118.         } while(root != tail);
  1119.         FreeCircularList(tail);
  1120.     }
  1121.     p -> class_body = (AstClassBody *) Sym(6);
  1122.     Sym(1) = p;
  1123. }
  1124. ./
  1125.  
  1126. Super ::= 'extends' ClassType
  1127. \:$SetSym1ToSym2:\
  1128. /.$location
  1129. void Parser::SetSym1ToSym2(void) { Sym(1) = Sym(2); }
  1130. ./
  1131.  
  1132. Interfaces ::= 'implements' InterfaceTypeList
  1133. \:$SetSym1ToSym2:\
  1134. /.$shared_function
  1135. //
  1136. // void SetSym1ToSym2(void);
  1137. //./
  1138.  
  1139. InterfaceTypeList ::= InterfaceType
  1140. \:$action:\
  1141. /.$location
  1142. //
  1143. // Note that the list is circular so as to preserve the order of the elements
  1144. //
  1145. void Parser::Act$rule_number(void)
  1146. {
  1147.     AstListNode *p = AllocateListNode();
  1148.     p -> next = p;
  1149.     p -> element = Sym(1);
  1150.     p -> index = 0;
  1151.  
  1152.     Sym(1) = p;
  1153. }
  1154. ./
  1155.  
  1156. InterfaceTypeList ::= InterfaceTypeList ',' InterfaceType
  1157. \:$action:\
  1158. /.$location
  1159. //
  1160. // Note that the list is circular so as to preserve the order of the elements
  1161. //
  1162. void Parser::Act$rule_number(void)
  1163. {
  1164.     AstListNode *tail = (AstListNode *) Sym(1);
  1165.  
  1166.     AstListNode *p = AllocateListNode();
  1167.     p -> element = Sym(3);
  1168.     p -> index = tail -> index + 1;
  1169.  
  1170.     p -> next = tail -> next;
  1171.     tail -> next = p;
  1172.  
  1173.     Sym(1) = p;
  1174. }
  1175. ./
  1176.  
  1177. ClassBody ::= '{' ClassBodyDeclarationsopt '}'
  1178. \:$action:\
  1179. /.$location
  1180. void Parser::Act$rule_number(void)
  1181. {
  1182.     AstClassBody *p = ast_pool -> NewClassBody();
  1183.     if (parse_header_only)
  1184.         p -> mark_unparsed();
  1185.  
  1186.     p -> left_brace_token = Token(1);
  1187.     if (Sym(2) != NULL)
  1188.     {
  1189.         int num_instance_variables = 0,
  1190.             num_class_variables = 0,
  1191.             num_methods = 0,
  1192.             num_constructors = 0,
  1193.             num_static_initializers = 0,
  1194.             num_inner_classes = 0,
  1195.             num_inner_interfaces = 0,
  1196.             num_blocks = 0,
  1197.             num_empty_declarations = 0;
  1198.  
  1199.         AstListNode *tail = (AstListNode *) Sym(2);
  1200.         p -> AllocateClassBodyDeclarations(tail -> index + 1);
  1201.         AstListNode *root = tail;
  1202.         do
  1203.         {
  1204.             root = root -> next;
  1205.             p -> AddClassBodyDeclaration(root -> element);
  1206.  
  1207.             AstFieldDeclaration *field_declaration = root -> element -> FieldDeclarationCast();
  1208.             if (field_declaration)
  1209.             {
  1210.                 for (int i = 0; i < field_declaration -> NumVariableModifiers(); i++)
  1211.                 {
  1212.                     if (field_declaration -> VariableModifier(i) -> kind == Ast::STATIC)
  1213.                     {
  1214.                         field_declaration -> MarkStatic();
  1215.                         break;
  1216.                     }
  1217.                 }
  1218.                 if (field_declaration -> StaticFieldCast())
  1219.                      num_class_variables++;
  1220.                 else num_instance_variables++;
  1221.             }
  1222.             else if (root -> element -> MethodDeclarationCast())
  1223.             {
  1224.                 num_methods++;
  1225.             }
  1226.             else if (root -> element -> ConstructorDeclarationCast())
  1227.             {
  1228.                 num_constructors++;
  1229.             }
  1230.             else if (root -> element -> StaticInitializerCast())
  1231.             {
  1232.                 num_static_initializers++;
  1233.             }
  1234.             else if (root -> element -> ClassDeclarationCast())
  1235.             {
  1236.                 num_inner_classes++;
  1237.             }
  1238.             else if (root -> element -> InterfaceDeclarationCast())
  1239.             {
  1240.                 num_inner_interfaces++;
  1241.             }
  1242.             else if (root -> element -> BlockCast())
  1243.             {
  1244.                 num_blocks++;
  1245.             }
  1246.             else num_empty_declarations++;
  1247.         } while(root != tail);
  1248.  
  1249.         p -> AllocateInstanceVariables(num_instance_variables);
  1250.         p -> AllocateClassVariables(num_class_variables);
  1251.         p -> AllocateMethods(num_methods);
  1252.         p -> AllocateConstructors(num_constructors);
  1253.         p -> AllocateStaticInitializers(num_static_initializers);
  1254.         p -> AllocateNestedClasses(num_inner_classes);
  1255.         p -> AllocateNestedInterfaces(num_inner_interfaces);
  1256.         p -> AllocateBlocks(num_blocks);
  1257.         p -> AllocateEmptyDeclarations(num_empty_declarations);
  1258.  
  1259.         root = tail;
  1260.         do
  1261.         {
  1262.             root = root -> next;
  1263.  
  1264.             AstFieldDeclaration *field_declaration;
  1265.             AstMethodDeclaration *method_declaration;
  1266.             AstConstructorDeclaration *constructor_declaration;
  1267.             AstStaticInitializer *static_initializer;
  1268.             AstClassDeclaration *class_declaration;
  1269.             AstInterfaceDeclaration *interface_declaration;
  1270.             AstBlock *block;
  1271.  
  1272.             if (field_declaration = root -> element -> FieldDeclarationCast())
  1273.             {
  1274.                 if (field_declaration -> StaticFieldCast())
  1275.                      p -> AddClassVariable(field_declaration);
  1276.                 else p -> AddInstanceVariable(field_declaration);
  1277.             }
  1278.             else if (method_declaration = root -> element -> MethodDeclarationCast())
  1279.             {
  1280.                 p -> AddMethod(method_declaration);
  1281.             }
  1282.             else if (constructor_declaration = root -> element -> ConstructorDeclarationCast())
  1283.             {
  1284.                 p -> AddConstructor(constructor_declaration);
  1285.             }
  1286.             else if (static_initializer = root -> element -> StaticInitializerCast())
  1287.             {
  1288.                 p -> AddStaticInitializer(static_initializer);
  1289.             }
  1290.             else if (class_declaration = root -> element -> ClassDeclarationCast())
  1291.             {
  1292.                 p -> AddNestedClass(class_declaration);
  1293.             }
  1294.             else if (interface_declaration = root -> element -> InterfaceDeclarationCast())
  1295.             {
  1296.                 p -> AddNestedInterface(interface_declaration);
  1297.             }
  1298.             else if (block = root -> element -> BlockCast())
  1299.             {
  1300.                 p -> AddBlock(block);
  1301.             }
  1302.             else // assert(block = root -> element -> EmptyDeclarationCast())
  1303.             {
  1304.                 p -> AddEmptyDeclaration((AstEmptyDeclaration *) root -> element);
  1305.             }
  1306.         } while(root != tail);
  1307.         FreeCircularList(tail);
  1308.     }
  1309.     p -> right_brace_token = Token(3);
  1310.     p -> pool = body_pool; // from now on, this is the storage pool to use for this type
  1311.     Sym(1) = p;
  1312. }
  1313. ./
  1314.  
  1315. ClassBodyDeclarations ::= ClassBodyDeclaration
  1316. \:$action:\
  1317. /.$location
  1318. //
  1319. // Note that the list is circular so as to preserve the order of the elements
  1320. //
  1321. void Parser::Act$rule_number(void)
  1322. {
  1323.     AstListNode *p = AllocateListNode();
  1324.     p -> next = p;
  1325.     p -> element = Sym(1);
  1326.     p -> index = 0;
  1327.  
  1328.     Sym(1) = p;
  1329. }
  1330. ./
  1331.  
  1332. ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration
  1333. \:$action:\
  1334. /.$location
  1335. //
  1336. // Note that the list is circular so as to preserve the order of the elements
  1337. //
  1338. void Parser::Act$rule_number(void)
  1339. {
  1340.     AstListNode *tail = (AstListNode *) Sym(1);
  1341.  
  1342.     AstListNode *p = AllocateListNode();
  1343.     p -> element = Sym(2);
  1344.     p -> index = tail -> index + 1;
  1345.  
  1346.     p -> next = tail -> next;
  1347.     tail -> next = p;
  1348.  
  1349.     Sym(1) = p;
  1350. }
  1351. ./
  1352.  
  1353. ClassBodyDeclaration -> ClassMemberDeclaration
  1354. \:$NoAction:\
  1355. /.$shared_NoAction./
  1356.  
  1357. ClassBodyDeclaration -> StaticInitializer
  1358. \:$NoAction:\
  1359. /.$shared_NoAction./
  1360.  
  1361. ClassBodyDeclaration -> ConstructorDeclaration
  1362. \:$NoAction:\
  1363. /.$shared_NoAction./
  1364.  
  1365. --1.1 feature
  1366. ClassBodyDeclaration ::= MethodHeaderMarker Block
  1367. \:$action:\
  1368. /.$location
  1369. void Parser::Act$rule_number(void)
  1370. {
  1371.     Sym(1) = Sym(2);
  1372. }
  1373. ./
  1374.  
  1375. ClassMemberDeclaration -> FieldDeclaration
  1376. \:$NoAction:\
  1377. /.$shared_NoAction./
  1378.  
  1379. ClassMemberDeclaration -> MethodDeclaration
  1380. \:$NoAction:\
  1381. /.$shared_NoAction./
  1382.  
  1383. --1.1 feature
  1384. ClassMemberDeclaration -> ClassDeclaration
  1385. \:$NoAction:\
  1386. /.$shared_NoAction./
  1387.  
  1388. --1.1 feature
  1389. ClassMemberDeclaration -> InterfaceDeclaration
  1390. \:$NoAction:\
  1391. /.$shared_NoAction./
  1392.  
  1393. --
  1394. -- Empty declarations are not valid Java ClassMemberDeclarations.
  1395. -- However, since the current (2/14/97) Java compiler accepts them 
  1396. -- (in fact, some of the official tests contain this erroneous
  1397. -- syntax), we decided to accept them as valid syntax and flag them
  1398. -- as a warning during semantic processing.
  1399. --
  1400. ClassMemberDeclaration ::= ';'
  1401. \:$action:\
  1402. /.$location
  1403. void Parser::Act$rule_number(void)
  1404. {
  1405.     Sym(1) = ast_pool -> NewEmptyDeclaration(Token(1));
  1406. }
  1407. ./
  1408.  
  1409. --18.8.2 Productions from 8.3: Field Declarations
  1410. --VariableModifier ::=
  1411. --      'public'
  1412. --    | 'protected'
  1413. --    | 'private'
  1414. --    | 'static'
  1415. --    | 'final'
  1416. --    | 'transient'
  1417. --    | 'volatile'
  1418.  
  1419. FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
  1420. \:$action:\
  1421. /.$location
  1422. void Parser::Act$rule_number(void)
  1423. {
  1424.     AstFieldDeclaration *p = ast_pool -> NewFieldDeclaration();
  1425.     if (Sym(1) != NULL)
  1426.     {   
  1427.         AstListNode *tail = (AstListNode *) Sym(1);
  1428.         p -> AllocateVariableModifiers(tail -> index + 1);
  1429.         AstListNode *root = tail;
  1430.         do
  1431.         {
  1432.             root = root -> next;
  1433.             p -> AddVariableModifier((AstModifier *) root -> element);
  1434.         } while(root != tail);
  1435.         FreeCircularList(tail);
  1436.     }
  1437.     p -> type = Sym(2);
  1438.     //
  1439.     // The list of declarators is guaranteed not empty
  1440.     //
  1441.     {   
  1442.         AstListNode *tail = (AstListNode *) Sym(3);
  1443.         p -> AllocateVariableDeclarators(tail -> index + 1);
  1444.         AstListNode *root = tail;
  1445.         do
  1446.         {
  1447.             root = root -> next;
  1448.             p -> AddVariableDeclarator((AstVariableDeclarator *) root -> element);
  1449.         } while(root != tail);
  1450.         FreeCircularList(tail);
  1451.     }
  1452.     p -> semicolon_token      = Token(4);
  1453.     Sym(1) = p;
  1454. }
  1455. ./
  1456.  
  1457. VariableDeclarators ::= VariableDeclarator
  1458. \:$action:\
  1459. /.$location
  1460. //
  1461. // Note that the list is circular so as to preserve the order of the elements
  1462. //
  1463. void Parser::Act$rule_number(void)
  1464. {
  1465.     AstListNode *p = AllocateListNode();
  1466.     p -> next = p;
  1467.     p -> element = Sym(1);
  1468.     p -> index = 0;
  1469.  
  1470.     Sym(1) = p;
  1471. }
  1472. ./
  1473.  
  1474. VariableDeclarators ::= VariableDeclarators ',' VariableDeclarator
  1475. \:$action:\
  1476. /.$location
  1477. //
  1478. // Note that the list is circular so as to preserve the order of the elements
  1479. //
  1480. void Parser::Act$rule_number(void)
  1481. {
  1482.     AstListNode *tail = (AstListNode *) Sym(1);
  1483.  
  1484.     AstListNode *p = AllocateListNode();
  1485.     p -> element = Sym(3);
  1486.     p -> index = tail -> index + 1;
  1487.  
  1488.     p -> next = tail -> next;
  1489.     tail -> next = p;
  1490.  
  1491.     Sym(1) = p;
  1492. }
  1493. ./
  1494.  
  1495. VariableDeclarator ::= VariableDeclaratorId
  1496. \:$action:\
  1497. /.$location
  1498. void Parser::Act$rule_number(void)
  1499. {
  1500.     AstVariableDeclarator *p = ast_pool -> NewVariableDeclarator();
  1501.     p -> variable_declarator_name = (AstVariableDeclaratorId *) Sym(1);
  1502.     p -> variable_initializer_opt = NULL;
  1503.     Sym(1) = p;
  1504. }
  1505. ./
  1506.  
  1507. VariableDeclarator ::= VariableDeclaratorId '=' VariableInitializer
  1508. \:$action:\
  1509. /.$location
  1510. void Parser::Act$rule_number(void)
  1511. {
  1512.     AstVariableDeclarator *p = ast_pool -> NewVariableDeclarator();
  1513.     p -> variable_declarator_name = (AstVariableDeclaratorId *) Sym(1);
  1514.     p -> variable_initializer_opt = Sym(3);
  1515.     Sym(1) = p;
  1516. }
  1517. ./
  1518.  
  1519. VariableDeclaratorId ::= 'Identifier' Dimsopt
  1520. \:$action:\
  1521. /.$location
  1522. void Parser::Act$rule_number(void)
  1523. {
  1524.     AstVariableDeclaratorId *p = ast_pool -> NewVariableDeclaratorId();
  1525.     p -> identifier_token = Token(1);
  1526.     if (Sym(2) != NULL)
  1527.     {
  1528.         AstListNode *tail = (AstListNode *) Sym(2);
  1529.         p -> AllocateBrackets(tail -> index + 1);
  1530.         AstListNode *root = tail;
  1531.         do
  1532.         {
  1533.             root = root -> next;
  1534.             p -> AddBrackets((AstBrackets *) root -> element);
  1535.         } while(root != tail);
  1536.         FreeCircularList(tail);
  1537.     }
  1538.     Sym(1) = p;
  1539. }
  1540. ./
  1541.  
  1542. VariableInitializer -> Expression
  1543. \:$NoAction:\
  1544. /.$shared_NoAction./
  1545.  
  1546. VariableInitializer -> ArrayInitializer
  1547. \:$NoAction:\
  1548. /.$shared_NoAction./
  1549.  
  1550. --18.8.3 Productions from 8.4: Method Declarations
  1551. --MethodModifier ::=
  1552. --      'public'
  1553. --    | 'protected'
  1554. --    | 'private'
  1555. --    | 'static'
  1556. --    | 'abstract'
  1557. --    | 'final'
  1558. --    | 'native'
  1559. --    | 'synchronized'
  1560. --
  1561. -- The original rule does not contain the "MethodHeaderMarker.
  1562. -- See explanation above.
  1563. --
  1564. -- MethodDeclaration ::= MethodHeader MethodBody
  1565. --
  1566.  
  1567. MethodDeclaration ::= MethodHeader MethodHeaderMarker MethodBody
  1568. \:$action:\
  1569. /.$location
  1570. void Parser::Act$rule_number(void)
  1571. {
  1572.     ((AstMethodDeclaration *) Sym(1)) -> method_body = (AstStatement *) Sym(3);
  1573. }
  1574. ./
  1575.  
  1576. MethodHeader ::= Modifiersopt Type MethodDeclarator Throwsopt
  1577. \:$action:\
  1578. /.$location
  1579. void Parser::Act$rule_number(void)
  1580. {
  1581.     AstMethodDeclaration *p = ast_pool -> NewMethodDeclaration();
  1582.     if (Sym(1) != NULL)
  1583.     {   
  1584.         AstListNode *tail = (AstListNode *) Sym(1);
  1585.         p -> AllocateMethodModifiers(tail -> index + 1);
  1586.         AstListNode *root = tail;
  1587.         do
  1588.         {
  1589.             root = root -> next;
  1590.             p -> AddMethodModifier((AstModifier *) root -> element);
  1591.         } while(root != tail);
  1592.         FreeCircularList(tail);
  1593.     }
  1594.     p -> type              = Sym(2);
  1595.     p -> method_declarator = (AstMethodDeclarator *) Sym(3);
  1596.     if (Sym(4) != NULL)
  1597.     {   
  1598.         AstListNode *tail = (AstListNode *) Sym(4);
  1599.         p -> AllocateThrows(tail -> index + 1);
  1600.         AstListNode *root = tail;
  1601.         do
  1602.         {
  1603.             root = root -> next;
  1604.             p -> AddThrow((AstExpression *) root -> element);
  1605.         } while(root != tail);
  1606.         FreeCircularList(tail);
  1607.     }
  1608.     Sym(1) = p;
  1609. }
  1610. ./
  1611.  
  1612. MethodHeader ::= Modifiersopt 'void' MethodDeclarator Throwsopt
  1613. \:$action:\
  1614. /.$location
  1615. void Parser::Act$rule_number(void)
  1616. {
  1617.     AstMethodDeclaration *p = ast_pool -> NewMethodDeclaration();
  1618.     if (Sym(1) != NULL)
  1619.     {   
  1620.         AstListNode *tail = (AstListNode *) Sym(1);
  1621.         p -> AllocateMethodModifiers(tail -> index + 1);
  1622.         AstListNode *root = tail;
  1623.         do
  1624.         {
  1625.             root = root -> next;
  1626.             p -> AddMethodModifier((AstModifier *) root -> element);
  1627.         } while(root != tail);
  1628.         FreeCircularList(tail);
  1629.     }
  1630.     p -> type              = ast_pool -> NewPrimitiveType(Ast::VOID_TYPE, Token(2));
  1631.     p -> method_declarator = (AstMethodDeclarator *) Sym(3);
  1632.     if (Sym(4) != NULL)
  1633.     {   
  1634.         AstListNode *tail = (AstListNode *) Sym(4);
  1635.         p -> AllocateThrows(tail -> index + 1);
  1636.         AstListNode *root = tail;
  1637.         do
  1638.         {
  1639.             root = root -> next;
  1640.             p -> AddThrow((AstExpression *) root -> element);
  1641.         } while(root != tail);
  1642.         FreeCircularList(tail);
  1643.     }
  1644.     Sym(1) = p;
  1645. }
  1646. ./
  1647.  
  1648. MethodDeclarator ::= 'Identifier' '(' FormalParameterListopt ')' Dimsopt
  1649. \:$action:\
  1650. /.$location
  1651. void Parser::Act$rule_number(void)
  1652. {
  1653.     AstMethodDeclarator *p = ast_pool -> NewMethodDeclarator();
  1654.     p -> identifier_token        = Token(1);
  1655.     p -> left_parenthesis_token  = Token(2);
  1656.     if (Sym(3) != NULL)
  1657.     {   
  1658.         AstListNode *tail = (AstListNode *) Sym(3);
  1659.         p -> AllocateFormalParameters(tail -> index + 1);
  1660.         AstListNode *root = tail;
  1661.         do
  1662.         {
  1663.             root = root -> next;
  1664.             p -> AddFormalParameter((AstFormalParameter *) root -> element);
  1665.         } while(root != tail);
  1666.         FreeCircularList(tail);
  1667.     }
  1668.     p -> right_parenthesis_token = Token(4);
  1669.     if (Sym(5) != NULL)
  1670.     {
  1671.         AstListNode *tail = (AstListNode *) Sym(5);
  1672.         p -> AllocateBrackets(tail -> index + 1);
  1673.         AstListNode *root = tail;
  1674.         do
  1675.         {
  1676.             root = root -> next;
  1677.             p -> AddBrackets((AstBrackets *) root -> element);
  1678.         } while(root != tail);
  1679.         FreeCircularList(tail);
  1680.     }
  1681.     Sym(1) = p;
  1682. }
  1683. ./
  1684.  
  1685. FormalParameterList ::= FormalParameter
  1686. \:$action:\
  1687. /.$location
  1688. //
  1689. // Note that the list is circular so as to preserve the order of the elements
  1690. //
  1691. void Parser::Act$rule_number(void)
  1692. {
  1693.     AstListNode *p = AllocateListNode();
  1694.     p -> next = p;
  1695.     p -> element = Sym(1);
  1696.     p -> index = 0;
  1697.  
  1698.     Sym(1) = p;
  1699. }
  1700. ./
  1701.  
  1702. FormalParameterList ::= FormalParameterList ',' FormalParameter
  1703. \:$action:\
  1704. /.$location
  1705. //
  1706. // Note that the list is circular so as to preserve the order of the elements
  1707. //
  1708. void Parser::Act$rule_number(void)
  1709. {
  1710.     AstListNode *tail = (AstListNode *) Sym(1);
  1711.  
  1712.     AstListNode *p = AllocateListNode();
  1713.     p -> element = Sym(3);
  1714.     p -> index = tail -> index + 1;
  1715.  
  1716.     p -> next = tail -> next;
  1717.     tail -> next = p;
  1718.  
  1719.     Sym(1) = p;
  1720. }
  1721. ./
  1722.  
  1723. FormalParameter ::= Type VariableDeclaratorId
  1724. \:$action:\
  1725. /.$location
  1726. void Parser::Act$rule_number(void)
  1727. {
  1728.     AstFormalParameter *p = ast_pool -> NewFormalParameter();
  1729.     p -> type                     = Sym(1);
  1730.     p -> variable_declarator_name = (AstVariableDeclaratorId *) Sym(2);
  1731.     Sym(1) = p;
  1732. }
  1733. ./
  1734.  
  1735. --1.1 feature
  1736. FormalParameter ::= Modifiers Type VariableDeclaratorId
  1737. \:$action:\
  1738. /.$location
  1739. void Parser::Act$rule_number(void)
  1740. {
  1741.     AstFormalParameter *p = ast_pool -> NewFormalParameter();
  1742.     //
  1743.     // The list of modifiers is guaranteed not empty
  1744.     //
  1745.     {   
  1746.         AstListNode *tail = (AstListNode *) Sym(1);
  1747.         p -> AllocateParameterModifiers(tail -> index + 1);
  1748.         AstListNode *root = tail;
  1749.         do
  1750.         {
  1751.             root = root -> next;
  1752.             p -> AddParameterModifier((AstModifier *) root -> element);
  1753.         } while(root != tail);
  1754.         FreeCircularList(tail);
  1755.     }
  1756.     p -> type                     = Sym(2);
  1757.     p -> variable_declarator_name = (AstVariableDeclaratorId *) Sym(3);
  1758.     Sym(1) = p;
  1759. }
  1760. ./
  1761.  
  1762. Throws ::= 'throws' ClassTypeList
  1763. \:$SetSym1ToSym2:\
  1764. /.$shared_function
  1765. //
  1766. // void SetSym1ToSym2(void);
  1767. //./
  1768.  
  1769. ClassTypeList ::= ClassType
  1770. \:$action:\
  1771. /.$location
  1772. //
  1773. // Note that the list is circular so as to preserve the order of the elements
  1774. //
  1775. void Parser::Act$rule_number(void)
  1776. {
  1777.     AstListNode *p = AllocateListNode();
  1778.     p -> next = p;
  1779.     p -> element = Sym(1);
  1780.     p -> index = 0;
  1781.  
  1782.     Sym(1) = p;
  1783. }
  1784. ./
  1785.  
  1786. ClassTypeList ::= ClassTypeList ',' ClassType
  1787. \:$action:\
  1788. /.$location
  1789. //
  1790. // Note that the list is circular so as to preserve the order of the elements
  1791. //
  1792. void Parser::Act$rule_number(void)
  1793. {
  1794.     AstListNode *tail = (AstListNode *) Sym(1);
  1795.  
  1796.     AstListNode *p = AllocateListNode();
  1797.     p -> element = Sym(3);
  1798.     p -> index = tail -> index + 1;
  1799.  
  1800.     p -> next = tail -> next;
  1801.     tail -> next = p;
  1802.  
  1803.     Sym(1) = p;
  1804. }
  1805. ./
  1806.  
  1807. MethodBody -> Block
  1808. \:$NoAction:\
  1809. /.$shared_NoAction./
  1810.  
  1811. MethodBody ::= ';'
  1812. \:$MakeEmptyStatement:\
  1813. /.$location
  1814. void Parser::MakeEmptyStatement(void)
  1815. {
  1816.     Sym(1) = ast_pool -> NewEmptyStatement(Token(1));
  1817. }
  1818. ./
  1819.  
  1820. --18.8.4 Productions from 8.5: Static Initializers
  1821.  
  1822. StaticInitializer ::= 'static' MethodHeaderMarker Block
  1823. \:$action:\
  1824. /.$location
  1825. void Parser::Act$rule_number(void)
  1826. {
  1827.     AstStaticInitializer *p = ast_pool -> NewStaticInitializer();
  1828.     p -> static_token = Token(1);
  1829.     p -> block        = (AstBlock *) Sym(3);
  1830.     Sym(1) = p;
  1831. }
  1832. ./
  1833.  
  1834. --18.8.5 Productions from 8.6: Constructor Declarations
  1835. --ConstructorModifier ::=
  1836. --      'public'
  1837. --    | 'protected'
  1838. --    | 'private'
  1839. --
  1840. --
  1841. -- The original rule does not contain a "MethodHeaderMarker". See
  1842. -- explanation above.
  1843. --
  1844. -- ConstructorDeclaration ::= Modifiersopt ConstructorDeclarator Throwsopt ConstructorBody
  1845. --
  1846.  
  1847. ConstructorDeclaration ::= Modifiersopt ConstructorDeclarator Throwsopt MethodHeaderMarker ConstructorBody
  1848. \:$action:\
  1849. /.$location
  1850. void Parser::Act$rule_number(void)
  1851. {
  1852.     AstConstructorBlock *block = Sym(5) -> ConstructorBlockCast();
  1853.     if (! block)
  1854.     {
  1855.         block = ast_pool -> NewConstructorBlock();
  1856.         block -> left_brace_token                    = Sym(5) -> LeftToken();
  1857.         block -> explicit_constructor_invocation_opt = NULL;
  1858.         block -> block                               = (AstBlock *) Sym(5);
  1859.         block -> right_brace_token                   = Sym(5) -> RightToken();
  1860.     }
  1861.  
  1862.     AstConstructorDeclaration *p = ast_pool -> NewConstructorDeclaration();
  1863.  
  1864.     if (Sym(1) != NULL)
  1865.     {   
  1866.         AstListNode *tail = (AstListNode *) Sym(1);
  1867.         p -> AllocateConstructorModifiers(tail -> index + 1);
  1868.         AstListNode *root = tail;
  1869.         do
  1870.         {
  1871.             root = root -> next;
  1872.             p -> AddConstructorModifier((AstModifier *) root -> element);
  1873.         } while(root != tail);
  1874.         FreeCircularList(tail);
  1875.     }
  1876.     p -> constructor_declarator = (AstMethodDeclarator *) Sym(2);
  1877.     if (Sym(3) != NULL)
  1878.     {   
  1879.         AstListNode *tail = (AstListNode *) Sym(3);
  1880.         p -> AllocateThrows(tail -> index + 1);
  1881.         AstListNode *root = tail;
  1882.         do
  1883.         {
  1884.             root = root -> next;
  1885.             p -> AddThrow((AstExpression *) root -> element);
  1886.         } while(root != tail);
  1887.         FreeCircularList(tail);
  1888.     }
  1889.     p -> constructor_body       = block;
  1890.  
  1891.     Sym(1) = p;
  1892. }
  1893. ./
  1894.  
  1895. --
  1896. -- The original rule specifies SimpleName but it appears to be an
  1897. -- error as the rule for a method declarator uses an Identifier.
  1898. --...Until further notice, ...
  1899. --
  1900. -- ConstructorDeclarator ::= SimpleName '(' FormalParameterListopt ')'
  1901. --
  1902.  
  1903. ConstructorDeclarator ::= 'Identifier' '(' FormalParameterListopt ')'
  1904. \:$action:\
  1905. /.$location
  1906. void Parser::Act$rule_number(void)
  1907. {
  1908.     AstMethodDeclarator *p = ast_pool -> NewMethodDeclarator();
  1909.     p -> identifier_token        = Token(1);
  1910.     p -> left_parenthesis_token  = Token(2);
  1911.     if (Sym(3) != NULL)
  1912.     {   
  1913.         AstListNode *tail = (AstListNode *) Sym(3);
  1914.         p -> AllocateFormalParameters(tail -> index + 1);
  1915.         AstListNode *root = tail;
  1916.         do
  1917.         {
  1918.             root = root -> next;
  1919.             p -> AddFormalParameter((AstFormalParameter *) root -> element);
  1920.         } while(root != tail);
  1921.         FreeCircularList(tail);
  1922.     }
  1923.     p -> right_parenthesis_token = Token(4);
  1924.     Sym(1) = p;
  1925. }
  1926. ./
  1927.  
  1928. --
  1929. -- NOTE that the rules ExplicitConstructorInvocationopt has been expanded
  1930. -- in the rule below in order to make the grammar lalr(1).
  1931. --
  1932. -- ConstructorBody ::= '{' ExplicitConstructorInvocationopt BlockStatementsopt '}'
  1933. -- 
  1934. ConstructorBody -> Block
  1935. \:$NoAction:\
  1936. /.$shared_NoAction./
  1937.  
  1938. ConstructorBody ::= '{' ExplicitConstructorInvocation BlockStatementsopt '}'
  1939. \:$action:\
  1940. /.$location
  1941. void Parser::Act$rule_number(void)
  1942. {
  1943.     AstBlock *block = ast_pool -> NewBlock();
  1944.     if (Sym(3) != NULL)
  1945.     {
  1946.         AstListNode *tail = (AstListNode *) Sym(3);
  1947.         block -> AllocateBlockStatements(tail -> index + 1);
  1948.         AstListNode *root = tail;
  1949.         block -> left_brace_token  = root -> element -> LeftToken();
  1950.         block -> right_brace_token = tail -> element -> RightToken();
  1951.         do
  1952.         {
  1953.             root = root -> next;
  1954.             block -> AddStatement((AstStatement *) root -> element);
  1955.         } while(root != tail);
  1956.         FreeCircularList(tail);
  1957.     }
  1958.     else
  1959.     {
  1960.         block -> left_brace_token  = Token(4);
  1961.         block -> right_brace_token = Token(4);
  1962.     }
  1963.  
  1964.     AstConstructorBlock *p = ast_pool -> NewConstructorBlock();
  1965.     p -> left_brace_token                    = Token(1);
  1966.     p -> explicit_constructor_invocation_opt = Sym(2);
  1967.     p -> block                               = block;
  1968.     p -> right_brace_token                   = Token(4);
  1969.     Sym(1) = p;
  1970. }
  1971. ./
  1972.  
  1973. ExplicitConstructorInvocation ::= 'this' '(' ArgumentListopt ')' ';'
  1974. \:$action:\
  1975. /.$location
  1976. void Parser::Act$rule_number(void)
  1977. {
  1978.     AstThisCall *p = ast_pool -> NewThisCall();
  1979.     p -> base_opt                = NULL;
  1980.     p -> dot_token_opt           = 0;
  1981.     p -> this_token              = Token(1);
  1982.     p -> left_parenthesis_token  = Token(2);
  1983.     if (Sym(3) != NULL)
  1984.     {
  1985.         AstListNode *tail = (AstListNode *) Sym(3);
  1986.         p -> AllocateArguments(tail -> index + 1);
  1987.         AstListNode *root = tail;
  1988.         do
  1989.         {
  1990.             root = root -> next;
  1991.             p -> AddArgument((AstExpression *) root -> element);
  1992.         } while(root != tail);
  1993.         FreeCircularList(tail);
  1994.     }
  1995.     p -> right_parenthesis_token = Token(4);
  1996.     p -> semicolon_token         = Token(5);
  1997.     Sym(1) = p;
  1998. }
  1999. ./
  2000.  
  2001. ExplicitConstructorInvocation ::= 'super' '(' ArgumentListopt ')' ';'
  2002. \:$action:\
  2003. /.$location
  2004. void Parser::Act$rule_number(void)
  2005. {
  2006.     AstSuperCall *p = ast_pool -> NewSuperCall();
  2007.     p -> base_opt                = NULL;
  2008.     p -> dot_token_opt           = 0;
  2009.     p -> super_token             = Token(1);
  2010.     p -> left_parenthesis_token  = Token(2);
  2011.     if (Sym(3) != NULL)
  2012.     {
  2013.         AstListNode *tail = (AstListNode *) Sym(3);
  2014.         p -> AllocateArguments(tail -> index + 1);
  2015.         AstListNode *root = tail;
  2016.         do
  2017.         {
  2018.             root = root -> next;
  2019.             p -> AddArgument((AstExpression *) root -> element);
  2020.         } while(root != tail);
  2021.         FreeCircularList(tail);
  2022.     }
  2023.     p -> right_parenthesis_token = Token(4);
  2024.     p -> semicolon_token         = Token(5);
  2025.     Sym(1) = p;
  2026. }
  2027. ./
  2028.  
  2029. --1.2 feature
  2030. ExplicitConstructorInvocation ::= Primary '.' 'this' '(' ArgumentListopt ')' ';'
  2031. \:$action:\
  2032. /.$location
  2033. void Parser::Act$rule_number(void)
  2034. {
  2035.     AstThisCall *p = ast_pool -> NewThisCall();
  2036.     p -> base_opt               = (AstExpression *) Sym(1);
  2037.     p -> dot_token_opt          = Token(2);
  2038.     p -> this_token             = Token(3);
  2039.     p -> left_parenthesis_token = Token(4);
  2040.     if (Sym(5) != NULL)
  2041.     {
  2042.         AstListNode *tail = (AstListNode *) Sym(5);
  2043.         p -> AllocateArguments(tail -> index + 1);
  2044.         AstListNode *root = tail;
  2045.         do
  2046.         {
  2047.             root = root -> next;
  2048.             p -> AddArgument((AstExpression *) root -> element);
  2049.         } while(root != tail);
  2050.         FreeCircularList(tail);
  2051.     }
  2052.     p -> right_parenthesis_token = Token(6);
  2053.     p -> semicolon_token         = Token(7);
  2054.     Sym(1) = p;
  2055. }
  2056. ./
  2057.  
  2058. --1.1 feature
  2059. ExplicitConstructorInvocation ::= Primary '.' 'super' '(' ArgumentListopt ')' ';'
  2060. \:$MakeQualifiedSuper:\
  2061. /.$location
  2062. void Parser::MakeQualifiedSuper(void)
  2063. {
  2064.     AstSuperCall *p = ast_pool -> NewSuperCall();
  2065.     p -> base_opt                = (AstExpression *) Sym(1);
  2066.     p -> dot_token_opt           = Token(2);
  2067.     p -> super_token             = Token(3);
  2068.     p -> left_parenthesis_token  = Token(4);
  2069.     if (Sym(5) != NULL)
  2070.     {
  2071.         AstListNode *tail = (AstListNode *) Sym(5);
  2072.         p -> AllocateArguments(tail -> index + 1);
  2073.         AstListNode *root = tail;
  2074.         do
  2075.         {
  2076.             root = root -> next;
  2077.             p -> AddArgument((AstExpression *) root -> element);
  2078.         } while(root != tail);
  2079.         FreeCircularList(tail);
  2080.     }
  2081.     p -> right_parenthesis_token = Token(6);
  2082.     p -> semicolon_token         = Token(7);
  2083.     Sym(1) = p;
  2084. }
  2085. ./
  2086.  
  2087. --1.1 feature
  2088. ExplicitConstructorInvocation ::= Name '.' 'super' '(' ArgumentListopt ')' ';'
  2089. \:$MakeQualifiedSuper:\
  2090. /.$shared_function
  2091. //
  2092. // void MakeQualifiedSuper(void);
  2093. //./
  2094.  
  2095. --18.9 Productions from 9: Interface Declarations
  2096.  
  2097. --18.9.1 Productions from 9.1: Interface Declarations
  2098. --InterfaceModifier ::=
  2099. --      'public'
  2100. --    | 'abstract'
  2101. --
  2102. InterfaceDeclaration ::= Modifiersopt 'interface' 'Identifier' ExtendsInterfacesopt InterfaceBody
  2103. \:$action:\
  2104. /.$location
  2105. void Parser::Act$rule_number(void)
  2106. {
  2107.     AstInterfaceDeclaration *p = (AstInterfaceDeclaration *) Sym(5);
  2108.     if (Sym(1) != NULL)
  2109.     {   
  2110.         AstListNode *tail = (AstListNode *) Sym(1);
  2111.         p -> AllocateInterfaceModifiers(tail -> index + 1);
  2112.         AstListNode *root = tail;
  2113.         do
  2114.         {
  2115.             root = root -> next;
  2116.             p -> AddInterfaceModifier((AstModifier *) root -> element);
  2117.         } while(root != tail);
  2118.         FreeCircularList(tail);
  2119.     }
  2120.     p -> interface_token  = Token(2);
  2121.     p -> identifier_token = Token(3);
  2122.     if (Sym(4) != NULL)
  2123.     {
  2124.         AstListNode *tail = (AstListNode *) Sym(4);
  2125.         p -> AllocateExtendsInterfaces(tail -> index + 1);
  2126.         AstListNode *root = tail;
  2127.         do
  2128.         {
  2129.             root = root -> next;
  2130.             p -> AddExtendsInterface((AstExpression *) root -> element);
  2131.         } while(root != tail);
  2132.         FreeCircularList(tail);
  2133.     }
  2134.     Sym(1) = p;
  2135. }
  2136. ./
  2137.  
  2138. ExtendsInterfaces ::= 'extends' InterfaceTypeList
  2139. \:$SetSym1ToSym2:\
  2140. /.$shared_function
  2141. //
  2142. // void SetSym1ToSym2(void);
  2143. //./
  2144.  
  2145. InterfaceBody ::= '{' InterfaceMemberDeclarationsopt '}'
  2146. \:$action:\
  2147. /.$location
  2148. void Parser::Act$rule_number(void)
  2149. {
  2150.     AstInterfaceDeclaration *p = ast_pool -> NewInterfaceDeclaration();
  2151.     if (parse_header_only)
  2152.         p -> mark_unparsed();
  2153.  
  2154.     p -> left_brace_token = Token(1);
  2155.     if (Sym(2) != NULL)
  2156.     {   
  2157.         int num_class_variables = 0,
  2158.             num_methods = 0,
  2159.             num_inner_classes = 0,
  2160.             num_inner_interfaces = 0,
  2161.             num_empty_declarations = 0;
  2162.  
  2163.         AstListNode *tail = (AstListNode *) Sym(2);
  2164.         p -> AllocateInterfaceMemberDeclarations(tail -> index + 1);
  2165.         AstListNode *root = tail;
  2166.         do
  2167.         {
  2168.             root = root -> next;
  2169.             p -> AddInterfaceMemberDeclaration(root -> element);
  2170.  
  2171.             AstFieldDeclaration *field_declaration = root -> element -> FieldDeclarationCast();
  2172.             if (field_declaration)
  2173.             {
  2174.                 field_declaration -> MarkStatic();
  2175.                 num_class_variables++;
  2176.             }
  2177.             else if (root -> element -> MethodDeclarationCast())
  2178.             {
  2179.                 num_methods++;
  2180.             }
  2181.             else if (root -> element -> ClassDeclarationCast())
  2182.             {
  2183.                 num_inner_classes++;
  2184.             }
  2185.             else if (root -> element -> InterfaceDeclarationCast())
  2186.             {
  2187.                 num_inner_interfaces++;
  2188.             }
  2189.             else num_empty_declarations++;
  2190.         } while(root != tail);
  2191.  
  2192.         p -> AllocateClassVariables(num_class_variables);
  2193.         p -> AllocateMethods(num_methods);
  2194.         p -> AllocateNestedClasses(num_inner_classes);
  2195.         p -> AllocateNestedInterfaces(num_inner_interfaces);
  2196.         p -> AllocateEmptyDeclarations(num_empty_declarations);
  2197.  
  2198.         root = tail;
  2199.         do
  2200.         {
  2201.             root = root -> next;
  2202.  
  2203.             AstFieldDeclaration *field_declaration;
  2204.             AstMethodDeclaration *method_declaration;
  2205.             AstClassDeclaration *class_declaration;
  2206.             AstInterfaceDeclaration *interface_declaration;
  2207.  
  2208.             if (field_declaration = root -> element -> FieldDeclarationCast())
  2209.             {
  2210.                 p -> AddClassVariable(field_declaration);
  2211.             }
  2212.             else if (method_declaration = root -> element -> MethodDeclarationCast())
  2213.             {
  2214.                 p -> AddMethod(method_declaration);
  2215.             }
  2216.             else if (class_declaration = root -> element -> ClassDeclarationCast())
  2217.             {
  2218.                 p -> AddNestedClass(class_declaration);
  2219.             }
  2220.             else if (interface_declaration = root -> element -> InterfaceDeclarationCast())
  2221.             {
  2222.                 p -> AddNestedInterface(interface_declaration);
  2223.             }
  2224.             else // assert(interface_declaration = root -> element -> EmptyDeclarationCast())
  2225.             {
  2226.                 p -> AddEmptyDeclaration((AstEmptyDeclaration *) root -> element);
  2227.             }
  2228.         } while(root != tail);
  2229.         FreeCircularList(tail);
  2230.     }
  2231.     p -> right_brace_token = Token(3);
  2232.     p -> pool = body_pool; // from now on, this is the storage pool to use for this type
  2233.     Sym(1) = p;
  2234. }
  2235. ./
  2236.  
  2237. InterfaceMemberDeclarations ::= InterfaceMemberDeclaration
  2238. \:$action:\
  2239. /.$location
  2240. //
  2241. // Note that the list is circular so as to preserve the order of the elements
  2242. //
  2243. void Parser::Act$rule_number(void)
  2244. {
  2245.     AstListNode *p = AllocateListNode();
  2246.     p -> next = p;
  2247.     p -> element = Sym(1);
  2248.     p -> index = 0;
  2249.  
  2250.     Sym(1) = p;
  2251. }
  2252. ./
  2253.  
  2254. InterfaceMemberDeclarations ::= InterfaceMemberDeclarations InterfaceMemberDeclaration
  2255. \:$action:\
  2256. /.$location
  2257. //
  2258. // Note that the list is circular so as to preserve the order of the elements
  2259. //
  2260. void Parser::Act$rule_number(void)
  2261. {
  2262.     AstListNode *tail = (AstListNode *) Sym(1);
  2263.  
  2264.     AstListNode *p = AllocateListNode();
  2265.     p -> element = Sym(2);
  2266.     p -> index = tail -> index + 1;
  2267.  
  2268.     p -> next = tail -> next;
  2269.     tail -> next = p;
  2270.  
  2271.     Sym(1) = p;
  2272. }
  2273. ./
  2274.  
  2275. InterfaceMemberDeclaration -> ConstantDeclaration
  2276. \:$NoAction:\
  2277. /.$shared_NoAction./
  2278.  
  2279. InterfaceMemberDeclaration -> AbstractMethodDeclaration
  2280. \:$NoAction:\
  2281. /.$shared_NoAction./
  2282.  
  2283. --1.1 feature
  2284. InterfaceMemberDeclaration -> ClassDeclaration
  2285. \:$NoAction:\
  2286. /.$shared_NoAction./
  2287.  
  2288. --1.1 feature
  2289. InterfaceMemberDeclaration -> InterfaceDeclaration
  2290. \:$NoAction:\
  2291. /.$shared_NoAction./
  2292.  
  2293. --
  2294. -- Empty declarations are not valid Java InterfaceMemberDeclarations.
  2295. -- However, since the current (2/14/97) Java compiler accepts them 
  2296. -- (in fact, some of the official tests contain this erroneous
  2297. -- syntax), we decided to accept them as valid syntax and flag them
  2298. -- as a warning during semantic processing.
  2299. --
  2300. InterfaceMemberDeclaration ::= ';'
  2301. \:$action:\
  2302. /.$location
  2303. void Parser::Act$rule_number(void)
  2304. {
  2305.     Sym(1) = ast_pool -> NewEmptyDeclaration(Token(1));
  2306. }
  2307. ./
  2308.  
  2309. ConstantDeclaration -> FieldDeclaration
  2310. \:$NoAction:\
  2311. /.$shared_NoAction./
  2312.  
  2313. AbstractMethodDeclaration ::= MethodHeader ';'
  2314. \:$action:\
  2315. /.$location
  2316. void Parser::Act$rule_number(void)
  2317. {
  2318.     ((AstMethodDeclaration *) Sym(1)) -> method_body = ast_pool -> NewEmptyStatement(Token(2));
  2319. }
  2320. ./
  2321.  
  2322. --18.10 Productions from 10: Arrays
  2323.  
  2324. --
  2325. -- NOTE that the rules VariableInitializersopt and ,opt have been expanded,
  2326. -- where appropriate, in the rule below in order to make the grammar lalr(1).
  2327. --
  2328. -- ArrayInitializer ::= '{' VariableInitializersopt ,opt '}'
  2329. --
  2330. ArrayInitializer ::= '{' ,opt '}'
  2331. \:$action:\
  2332. /.$location
  2333. void Parser::Act$rule_number(void)
  2334. {
  2335.     AstArrayInitializer *p = ast_pool -> NewArrayInitializer();
  2336.     p -> left_brace_token      = Token(1);
  2337.     p -> right_brace_token     = Token(3);
  2338.     Sym(1) = p;
  2339. }
  2340. ./
  2341.  
  2342. ArrayInitializer ::= '{' VariableInitializers '}'
  2343. \:$action:\
  2344. /.$location
  2345. void Parser::Act$rule_number(void)
  2346. {
  2347.     AstArrayInitializer *p = ast_pool -> NewArrayInitializer();
  2348.     p -> left_brace_token      = Token(1);
  2349.     if (Sym(2) != NULL)
  2350.     {
  2351.         AstListNode *tail = (AstListNode *) Sym(2);
  2352.         p -> AllocateVariableInitializers(tail -> index + 1);
  2353.         AstListNode *root = tail;
  2354.         do
  2355.         {
  2356.             root = root -> next;
  2357.             p -> AddVariableInitializer(root -> element);
  2358.         } while(root != tail);
  2359.         FreeCircularList(tail);
  2360.     }
  2361.     p -> right_brace_token     = Token(3);
  2362.     Sym(1) = p;
  2363. }
  2364. ./
  2365.  
  2366. ArrayInitializer ::= '{' VariableInitializers , '}'
  2367. \:$action:\
  2368. /.$location
  2369. void Parser::Act$rule_number(void)
  2370. {
  2371.     AstArrayInitializer *p = ast_pool -> NewArrayInitializer();
  2372.     p -> left_brace_token      = Token(1);
  2373.     if (Sym(2) != NULL)
  2374.     {
  2375.         AstListNode *tail = (AstListNode *) Sym(2);
  2376.         p -> AllocateVariableInitializers(tail -> index + 1);
  2377.         AstListNode *root = tail;
  2378.         do
  2379.         {
  2380.             root = root -> next;
  2381.             p -> AddVariableInitializer(root -> element);
  2382.         } while(root != tail);
  2383.         FreeCircularList(tail);
  2384.     }
  2385.     p -> right_brace_token     = Token(4);
  2386.     Sym(1) = p;
  2387. }
  2388. ./
  2389.  
  2390. VariableInitializers ::= VariableInitializer
  2391. \:$action:\
  2392. /.$location
  2393. //
  2394. // Note that the list is circular so as to preserve the order of the elements
  2395. //
  2396. void Parser::Act$rule_number(void)
  2397. {
  2398.     AstListNode *p = AllocateListNode();
  2399.     p -> next = p;
  2400.     p -> element = Sym(1);
  2401.     p -> index = 0;
  2402.  
  2403.     Sym(1) = p;
  2404. }
  2405. ./
  2406.  
  2407. VariableInitializers ::= VariableInitializers ',' VariableInitializer
  2408. \:$action:\
  2409. /.$location
  2410. //
  2411. // Note that the list is circular so as to preserve the order of the elements
  2412. //
  2413. void Parser::Act$rule_number(void)
  2414. {
  2415.     AstListNode *tail = (AstListNode *) Sym(1);
  2416.  
  2417.     AstListNode *p = AllocateListNode();
  2418.     p -> element = Sym(3);
  2419.     p -> index = tail -> index + 1;
  2420.  
  2421.     p -> next = tail -> next;
  2422.     tail -> next = p;
  2423.  
  2424.     Sym(1) = p;
  2425. }
  2426. ./
  2427.  
  2428. --18.11 Productions from 13: Blocks and Statements
  2429.  
  2430. Block ::= '{' BlockStatementsopt '}'
  2431. \:$action:\
  2432. /.$location
  2433. void Parser::Act$rule_number(void)
  2434. {
  2435.     AstBlock *p = ast_pool -> NewBlock();
  2436.     p -> left_brace_token  = Token(1);
  2437.     if (Sym(2) != NULL)
  2438.     {
  2439.         AstListNode *tail = (AstListNode *) Sym(2);
  2440.         p -> AllocateBlockStatements(tail -> index + 1);
  2441.         AstListNode *root = tail;
  2442.         do
  2443.         {
  2444.             root = root -> next;
  2445.             p -> AddStatement((AstStatement *) root -> element);
  2446.         } while(root != tail);
  2447.         FreeCircularList(tail);
  2448.     }
  2449.     p -> right_brace_token = Token(3);
  2450.     Sym(1) = p;
  2451. }
  2452. ./
  2453.  
  2454. BlockStatements ::= BlockStatement
  2455. \:$action:\
  2456. /.$location
  2457. //
  2458. // Note that the list is circular so as to preserve the order of the elements
  2459. //
  2460. void Parser::Act$rule_number(void)
  2461. {
  2462.     AstListNode *p = AllocateListNode();
  2463.     p -> next = p;
  2464.     p -> element = Sym(1);
  2465.     p -> index = 0;
  2466.  
  2467.     Sym(1) = p;
  2468. }
  2469. ./
  2470.  
  2471. BlockStatements ::= BlockStatements BlockStatement
  2472. \:$action:\
  2473. /.$location
  2474. //
  2475. // Note that the list is circular so as to preserve the order of the elements
  2476. //
  2477. void Parser::Act$rule_number(void)
  2478. {
  2479.     AstListNode *tail = (AstListNode *) Sym(1);
  2480.  
  2481.     AstListNode *p = AllocateListNode();
  2482.     p -> element = Sym(2);
  2483.     p -> index = tail -> index + 1;
  2484.  
  2485.     p -> next = tail -> next;
  2486.     tail -> next = p;
  2487.  
  2488.     Sym(1) = p;
  2489. }
  2490. ./
  2491.  
  2492. BlockStatement -> LocalVariableDeclarationStatement
  2493. \:$NoAction:\
  2494. /.$shared_NoAction./
  2495.  
  2496. BlockStatement -> Statement
  2497. \:$NoAction:\
  2498. /.$shared_NoAction./
  2499.  
  2500. --1.1 feature
  2501. BlockStatement -> ClassDeclaration
  2502. \:$NoAction:\
  2503. /.$shared_NoAction./
  2504.  
  2505. LocalVariableDeclarationStatement ::= LocalVariableDeclaration ';'
  2506. \:$action:\
  2507. /.$location
  2508. void Parser::Act$rule_number(void)
  2509. {
  2510.     ((AstLocalVariableDeclarationStatement *) Sym(1)) -> semicolon_token_opt = Token(2);
  2511. }
  2512. ./
  2513.  
  2514. LocalVariableDeclaration ::= Type VariableDeclarators
  2515. \:$action:\
  2516. /.$location
  2517. void Parser::Act$rule_number(void)
  2518. {
  2519.     AstLocalVariableDeclarationStatement *p = ast_pool -> NewLocalVariableDeclarationStatement();
  2520.     p -> type                 = Sym(1);
  2521.     //
  2522.     // The list of declarators is guaranteed not empty
  2523.     //
  2524.     {   
  2525.         AstListNode *tail = (AstListNode *) Sym(2);
  2526.         p -> AllocateVariableDeclarators(tail -> index + 1);
  2527.         AstListNode *root = tail;
  2528.         do
  2529.         {
  2530.             root = root -> next;
  2531.             p -> AddVariableDeclarator((AstVariableDeclarator *) root -> element);
  2532.         } while(root != tail);
  2533.         FreeCircularList(tail);
  2534.     }
  2535.     p -> semicolon_token_opt  = 0;
  2536.     Sym(1) = p;
  2537. }
  2538. ./
  2539.  
  2540. --1.1 feature
  2541. LocalVariableDeclaration ::= Modifiers Type VariableDeclarators
  2542. \:$action:\
  2543. /.$location
  2544. void Parser::Act$rule_number(void)
  2545. {
  2546.     AstLocalVariableDeclarationStatement *p = ast_pool -> NewLocalVariableDeclarationStatement();
  2547.     //
  2548.     // The list of modifiers is guaranteed not empty
  2549.     //
  2550.     {   
  2551.         AstListNode *tail = (AstListNode *) Sym(1);
  2552.         p -> AllocateLocalModifiers(tail -> index + 1);
  2553.         AstListNode *root = tail;
  2554.         do
  2555.         {
  2556.             root = root -> next;
  2557.             p -> AddLocalModifier((AstModifier *) root -> element);
  2558.         } while(root != tail);
  2559.         FreeCircularList(tail);
  2560.     }
  2561.     p -> type = Sym(2);
  2562.     //
  2563.     // The list of declarators is guaranteed not empty
  2564.     //
  2565.     {   
  2566.         AstListNode *tail = (AstListNode *) Sym(3);
  2567.         p -> AllocateVariableDeclarators(tail -> index + 1);
  2568.         AstListNode *root = tail;
  2569.         do
  2570.         {
  2571.             root = root -> next;
  2572.             p -> AddVariableDeclarator((AstVariableDeclarator *) root -> element);
  2573.         } while(root != tail);
  2574.         FreeCircularList(tail);
  2575.     }
  2576.     p -> semicolon_token_opt  = 0;
  2577.     Sym(1) = p;
  2578. }
  2579. ./
  2580.  
  2581. Statement -> StatementWithoutTrailingSubstatement
  2582. \:$NoAction:\
  2583. /.$shared_NoAction./
  2584.  
  2585. Statement -> LabeledStatement
  2586. \:$NoAction:\
  2587. /.$shared_NoAction./
  2588.  
  2589. Statement -> IfThenStatement
  2590. \:$NoAction:\
  2591. /.$shared_NoAction./
  2592.  
  2593. Statement -> IfThenElseStatement
  2594. \:$NoAction:\
  2595. /.$shared_NoAction./
  2596.  
  2597. Statement -> WhileStatement
  2598. \:$NoAction:\
  2599. /.$shared_NoAction./
  2600.  
  2601. Statement -> ForStatement
  2602. \:$NoAction:\
  2603. /.$shared_NoAction./
  2604.  
  2605. StatementNoShortIf -> StatementWithoutTrailingSubstatement
  2606. \:$NoAction:\
  2607. /.$shared_NoAction./
  2608.  
  2609. StatementNoShortIf -> LabeledStatementNoShortIf
  2610. \:$NoAction:\
  2611. /.$shared_NoAction./
  2612.  
  2613. StatementNoShortIf -> IfThenElseStatementNoShortIf
  2614. \:$NoAction:\
  2615. /.$shared_NoAction./
  2616.  
  2617. StatementNoShortIf -> WhileStatementNoShortIf
  2618. \:$NoAction:\
  2619. /.$shared_NoAction./
  2620.  
  2621. StatementNoShortIf -> ForStatementNoShortIf
  2622. \:$NoAction:\
  2623. /.$shared_NoAction./
  2624.  
  2625. StatementWithoutTrailingSubstatement -> Block
  2626. \:$NoAction:\
  2627. /.$shared_NoAction./
  2628.  
  2629. StatementWithoutTrailingSubstatement -> EmptyStatement
  2630. \:$NoAction:\
  2631. /.$shared_NoAction./
  2632.  
  2633. StatementWithoutTrailingSubstatement -> ExpressionStatement
  2634. \:$NoAction:\
  2635. /.$shared_NoAction./
  2636.  
  2637. StatementWithoutTrailingSubstatement -> SwitchStatement
  2638. \:$NoAction:\
  2639. /.$shared_NoAction./
  2640.  
  2641. StatementWithoutTrailingSubstatement -> DoStatement
  2642. \:$NoAction:\
  2643. /.$shared_NoAction./
  2644.  
  2645. StatementWithoutTrailingSubstatement -> BreakStatement
  2646. \:$NoAction:\
  2647. /.$shared_NoAction./
  2648.  
  2649. StatementWithoutTrailingSubstatement -> ContinueStatement
  2650. \:$NoAction:\
  2651. /.$shared_NoAction./
  2652.  
  2653. StatementWithoutTrailingSubstatement -> ReturnStatement
  2654. \:$NoAction:\
  2655. /.$shared_NoAction./
  2656.  
  2657. StatementWithoutTrailingSubstatement -> SynchronizedStatement
  2658. \:$NoAction:\
  2659. /.$shared_NoAction./
  2660.  
  2661. StatementWithoutTrailingSubstatement -> ThrowStatement
  2662. \:$NoAction:\
  2663. /.$shared_NoAction./
  2664.  
  2665. StatementWithoutTrailingSubstatement -> TryStatement
  2666. \:$NoAction:\
  2667. /.$shared_NoAction./
  2668.  
  2669. EmptyStatement ::= ';'
  2670. \:$MakeEmptyStatement:\
  2671. /.$shared_function
  2672. //
  2673. // void MakeEmptyStatement(void);
  2674. //./
  2675.  
  2676. LabeledStatement ::= 'Identifier' ':' Statement
  2677. \:$MakeLabeledStatement:\
  2678. /.$location
  2679. void Parser::MakeLabeledStatement(void)
  2680. {
  2681.     AstBlock *p = Sym(3) -> BlockCast();
  2682.  
  2683.     if (! (p && p -> NumStatements() == 1 &&
  2684.            (p -> Statement(0) -> kind == Ast::FOR   ||
  2685.             p -> Statement(0) -> kind == Ast::WHILE ||
  2686.             p -> Statement(0) -> kind == Ast::DO)))
  2687.     {
  2688.         //
  2689.         // When a statement is labeled, it is enclosed in a block.
  2690.         // This is necessary in order to allow the same name to be
  2691.         // reused to label a subsequent statement at the same nesting
  2692.         // level... See ProcessBlock, ProcessStatement,...
  2693.         //
  2694.         p = ast_pool -> NewBlock();
  2695.         p -> AllocateBlockStatements(1); // allocate 1 element
  2696.         p -> left_brace_token  = Token(1);
  2697.         p -> AddStatement((AstStatement *) Sym(3));
  2698.         p -> right_brace_token = Sym(3) -> RightToken();
  2699.     }
  2700.  
  2701.     p -> label_token_opt = Token(1); // add label to statement
  2702.     Sym(1) = p; // The final result is a block containing the labeled-statement
  2703. }
  2704. ./
  2705.  
  2706. LabeledStatementNoShortIf ::= 'Identifier' ':' StatementNoShortIf
  2707. \:$MakeLabeledStatement:\
  2708. /.$shared_function
  2709. //
  2710. // void MakeLabeledStatement(void);
  2711. //./
  2712.  
  2713. ExpressionStatement ::= StatementExpression ';'
  2714. \:$action:\
  2715. /.$location
  2716. void Parser::Act$rule_number(void)
  2717. {
  2718.     ((AstExpressionStatement *) Sym(1)) -> semicolon_token_opt = Token(2);
  2719. }
  2720. ./
  2721.  
  2722. StatementExpression ::= Assignment
  2723. \:$MakeExpressionStatement:\
  2724. /.$location
  2725. void Parser::MakeExpressionStatement(void)
  2726. {
  2727.     AstExpressionStatement *p = ast_pool -> NewExpressionStatement();
  2728.     p -> expression          = (AstExpression *) Sym(1);
  2729.     p -> semicolon_token_opt = 0;
  2730.     Sym(1) = p;
  2731. }
  2732. ./
  2733.  
  2734. StatementExpression ::= PreIncrementExpression
  2735. \:$MakeExpressionStatement:\
  2736. /.$shared_function
  2737. //
  2738. // void MakeExpressionStatement(void);
  2739. //./
  2740.  
  2741. StatementExpression ::= PreDecrementExpression
  2742. \:$MakeExpressionStatement:\
  2743. /.$shared_function
  2744. //
  2745. // void MakeExpressionStatement(void);
  2746. //./
  2747.  
  2748. StatementExpression ::= PostIncrementExpression
  2749. \:$MakeExpressionStatement:\
  2750. /.$shared_function
  2751. //
  2752. // void MakeExpressionStatement(void);
  2753. //./
  2754.  
  2755. StatementExpression ::= PostDecrementExpression
  2756. \:$MakeExpressionStatement:\
  2757. /.$shared_function
  2758. //
  2759. // void MakeExpressionStatement(void);
  2760. //./
  2761.  
  2762. StatementExpression ::= MethodInvocation
  2763. \:$MakeExpressionStatement:\
  2764. /.$shared_function
  2765. //
  2766. // void MakeExpressionStatement(void);
  2767. //./
  2768.  
  2769. StatementExpression ::= ClassInstanceCreationExpression
  2770. \:$MakeExpressionStatement:\
  2771. /.$shared_function
  2772. //
  2773. // void MakeExpressionStatement(void);
  2774. //./
  2775.  
  2776. IfThenStatement ::=  'if' '(' Expression ')' Statement
  2777. \:$action:\
  2778. /.$location
  2779. void Parser::Act$rule_number(void)
  2780. {
  2781.     AstBlock *block = Sym(5) -> BlockCast();
  2782.     if (! block)
  2783.     {
  2784.         block = ast_pool -> NewBlock();
  2785.         block -> AllocateBlockStatements(1); // allocate 1 element
  2786.         block -> left_brace_token  = Token(5);
  2787.         block -> AddStatement((AstStatement *) Sym(5));
  2788.         block -> right_brace_token = Sym(5) -> RightToken();
  2789.     }
  2790.  
  2791.     AstIfStatement *p = ast_pool -> NewIfStatement();
  2792.     p -> if_token            = Token(1);
  2793.     p -> expression          = (AstExpression *) Sym(3);
  2794.     p -> true_statement      = block;
  2795.     p -> false_statement_opt = NULL;
  2796.     Sym(1) = p;
  2797. }
  2798. ./
  2799.  
  2800. IfThenElseStatement ::=  'if' '(' Expression ')' StatementNoShortIf 'else' Statement
  2801. \:$MakeIfThenElseStatement:\
  2802. /.$location
  2803. void Parser::MakeIfThenElseStatement(void)
  2804. {
  2805.     AstBlock *true_block = Sym(5) -> BlockCast();
  2806.     if (! true_block)
  2807.     {
  2808.         true_block = ast_pool -> NewBlock();
  2809.         true_block -> AllocateBlockStatements(1); // allocate 1 element
  2810.         true_block -> left_brace_token  = Token(5);
  2811.         true_block -> AddStatement((AstStatement *) Sym(5));
  2812.         true_block -> right_brace_token = Sym(5) -> RightToken();
  2813.     }
  2814.  
  2815.     AstBlock *false_block = Sym(7) -> BlockCast();
  2816.     if (! false_block)
  2817.     {
  2818.         false_block = ast_pool -> NewBlock();
  2819.         false_block -> AllocateBlockStatements(1); // allocate 1 element
  2820.         false_block -> left_brace_token  = Token(7);
  2821.         false_block -> AddStatement((AstStatement *) Sym(7));
  2822.         false_block -> right_brace_token = Sym(7) -> RightToken();
  2823.     }
  2824.  
  2825.     AstIfStatement *p = ast_pool -> NewIfStatement();
  2826.     p -> if_token            = Token(1);
  2827.     p -> expression          = (AstExpression *) Sym(3);
  2828.     p -> true_statement      = true_block;
  2829.     p -> false_statement_opt = false_block;
  2830.     Sym(1) = p;
  2831. }
  2832. ./
  2833.  
  2834. IfThenElseStatementNoShortIf ::=  'if' '(' Expression ')' StatementNoShortIf 'else' StatementNoShortIf
  2835. \:$MakeIfThenElseStatement:\
  2836. /.$shared_function
  2837. //
  2838. // void MakeIfThenElseStatement(void);
  2839. //./
  2840.  
  2841. SwitchStatement ::= 'switch' '(' Expression ')' SwitchBlock
  2842. \:$action:\
  2843. /.$location
  2844. void Parser::Act$rule_number(void)
  2845. {
  2846.     AstSwitchStatement *p = (AstSwitchStatement *) Sym(5);
  2847.     p -> switch_token = Token(1);
  2848.     p -> expression   = (AstExpression *) Sym(3);
  2849.     Sym(1) = p;
  2850. }
  2851. ./
  2852.  
  2853. SwitchBlock ::= '{' '}'
  2854. \:$action:\
  2855. /.$location
  2856. void Parser::Act$rule_number(void)
  2857. {
  2858.     AstSwitchStatement *p = ast_pool -> NewSwitchStatement();
  2859.  
  2860.     AstBlock *block = ast_pool -> NewBlock();
  2861.     block -> left_brace_token  = Token(1);
  2862.     block -> right_brace_token = Token(2);
  2863.  
  2864.     p -> switch_block = block;
  2865.  
  2866.     Sym(1) = p;
  2867. }
  2868. ./
  2869.  
  2870. SwitchBlock ::= '{' SwitchBlockStatements '}'
  2871. \:$action:\
  2872. /.$location
  2873. void Parser::Act$rule_number(void)
  2874. {
  2875.     AstSwitchStatement *p = ast_pool -> NewSwitchStatement();
  2876.  
  2877.     AstBlock *block = ast_pool -> NewBlock();
  2878.     block -> left_brace_token  = Token(1);
  2879.     if (Sym(2) != NULL)
  2880.     {
  2881.         AstListNode *tail = (AstListNode *) Sym(2);
  2882.         block -> AllocateBlockStatements(tail -> index + 1);
  2883.         AstListNode *root = tail;
  2884.         do
  2885.         {
  2886.             root = root -> next;
  2887.             block -> AddStatement((AstStatement *) root -> element);
  2888.         } while(root != tail);
  2889.         FreeCircularList(tail);
  2890.     }
  2891.     block -> right_brace_token = Token(3);
  2892.  
  2893.     p -> switch_block  = block;
  2894.  
  2895.     Sym(1) = p;
  2896. }
  2897. ./
  2898.  
  2899. SwitchBlock ::= '{' SwitchLabels '}'
  2900. \:$action:\
  2901. /.$location
  2902. void Parser::Act$rule_number(void)
  2903. {
  2904.     AstSwitchStatement *p = ast_pool -> NewSwitchStatement();
  2905.  
  2906.     AstSwitchBlockStatement *q = ast_pool -> NewSwitchBlockStatement();
  2907.     //
  2908.     // The list of SwitchBlockStatements is never null
  2909.     //
  2910.     {
  2911.         AstListNode *tail = (AstListNode *) Sym(2);
  2912.         q -> AllocateSwitchLabels(tail -> index + 1);
  2913.         AstListNode *root = tail;
  2914.         do
  2915.         {
  2916.             root = root -> next;
  2917.             q -> AddSwitchLabel((AstStatement *) root -> element);
  2918.         } while(root != tail);
  2919.         FreeCircularList(tail);
  2920.     }
  2921.  
  2922.     AstBlock *block = ast_pool -> NewBlock();
  2923.     block -> AllocateBlockStatements(1); // allocate 1 element
  2924.     block -> left_brace_token  = Token(1);
  2925.     block -> AddStatement(q);
  2926.     block -> right_brace_token = Token(3);
  2927.  
  2928.     p -> switch_block  = block;
  2929.  
  2930.     Sym(1) = p;
  2931. }
  2932. ./
  2933.  
  2934. SwitchBlock ::= '{' SwitchBlockStatements SwitchLabels '}'
  2935. \:$action:\
  2936. /.$location
  2937. void Parser::Act$rule_number(void)
  2938. {
  2939.     AstSwitchStatement *p = ast_pool -> NewSwitchStatement();
  2940.  
  2941.     AstBlock *block = ast_pool -> NewBlock();
  2942.     block -> left_brace_token  = Token(1);
  2943.     //
  2944.     // The list of SwitchBlockStatements is never null
  2945.     //
  2946.     {
  2947.         AstListNode *tail = (AstListNode *) Sym(2);
  2948.         block -> AllocateBlockStatements(tail -> index + 2); // +1 because of extra statement for additional SwithLabels
  2949.         AstListNode *root = tail;
  2950.         do
  2951.         {
  2952.             root = root -> next;
  2953.             block -> AddStatement((AstStatement *) root -> element);
  2954.         } while(root != tail);
  2955.         FreeCircularList(tail);
  2956.     }
  2957.  
  2958.     AstSwitchBlockStatement *q = ast_pool -> NewSwitchBlockStatement();
  2959.     //
  2960.     // The list of SwitchLabels is never null
  2961.     //
  2962.     {
  2963.         AstListNode *tail = (AstListNode *) Sym(3);
  2964.         q -> AllocateSwitchLabels(tail -> index + 1);
  2965.         AstListNode *root = tail;
  2966.         do
  2967.         {
  2968.             root = root -> next;
  2969.             q -> AddSwitchLabel(root -> element);
  2970.         } while(root != tail);
  2971.         FreeCircularList(tail);
  2972.     }
  2973.  
  2974.     block -> AddStatement(q);
  2975.     block -> right_brace_token = Token(4);
  2976.  
  2977.     p -> switch_block  = block;
  2978.  
  2979.     Sym(1) = p;
  2980. }
  2981. ./
  2982.  
  2983. SwitchBlockStatements ::= SwitchBlockStatement
  2984. \:$action:\
  2985. /.$location
  2986. //
  2987. // Note that the list is circular so as to preserve the order of the elements
  2988. //
  2989. void Parser::Act$rule_number(void)
  2990. {
  2991.     AstListNode *p = AllocateListNode();
  2992.     p -> next = p;
  2993.     p -> element = Sym(1);
  2994.     p -> index = 0;
  2995.  
  2996.     Sym(1) = p;
  2997. }
  2998. ./
  2999.  
  3000. SwitchBlockStatements ::= SwitchBlockStatements SwitchBlockStatement
  3001. \:$action:\
  3002. /.$location
  3003. //
  3004. // Note that the list is circular so as to preserve the order of the elements
  3005. //
  3006. void Parser::Act$rule_number(void)
  3007. {
  3008.     AstListNode *tail = (AstListNode *) Sym(1);
  3009.  
  3010.     AstListNode *p = AllocateListNode();
  3011.     p -> element = Sym(2);
  3012.     p -> index = tail -> index + 1;
  3013.  
  3014.     p -> next = tail -> next;
  3015.     tail -> next = p;
  3016.  
  3017.     Sym(1) = p;
  3018. }
  3019. ./
  3020.  
  3021. SwitchBlockStatement ::= SwitchLabels BlockStatements
  3022. \:$action:\
  3023. /.$location
  3024. void Parser::Act$rule_number(void)
  3025. {
  3026.     AstSwitchBlockStatement *p = ast_pool -> NewSwitchBlockStatement();
  3027.     //
  3028.     // The list of SwitchLabels is never null
  3029.     //
  3030.     {
  3031.         AstListNode *tail = (AstListNode *) Sym(1);
  3032.         p -> AllocateSwitchLabels(tail -> index + 1);
  3033.         AstListNode *root = tail;
  3034.         do
  3035.         {
  3036.             root = root -> next;
  3037.             p -> AddSwitchLabel(root -> element);
  3038.         } while(root != tail);
  3039.         FreeCircularList(tail);
  3040.     }
  3041.  
  3042.     //
  3043.     // The list of SwitchBlockStatements is never null
  3044.     //
  3045.     {
  3046.         AstListNode *tail = (AstListNode *) Sym(2);
  3047.         p -> AllocateBlockStatements(tail -> index + 1);
  3048.         AstListNode *root = tail;
  3049.         do
  3050.         {
  3051.             root = root -> next;
  3052.             p -> AddStatement((AstStatement *) root -> element);
  3053.         } while(root != tail);
  3054.         FreeCircularList(tail);
  3055.     }
  3056.     Sym(1) = p;
  3057. }
  3058. ./
  3059.  
  3060. SwitchLabels ::= SwitchLabel
  3061. \:$action:\
  3062. /.$location
  3063. //
  3064. // Note that the list is circular so as to preserve the order of the elements
  3065. //
  3066. void Parser::Act$rule_number(void)
  3067. {
  3068.     AstListNode *p = AllocateListNode();
  3069.     p -> next = p;
  3070.     p -> element = Sym(1);
  3071.     p -> index = 0;
  3072.  
  3073.     Sym(1) = p;
  3074. }
  3075. ./
  3076.  
  3077. SwitchLabels ::= SwitchLabels SwitchLabel
  3078. \:$action:\
  3079. /.$location
  3080. //
  3081. // Note that the list is circular so as to preserve the order of the elements
  3082. //
  3083. void Parser::Act$rule_number(void)
  3084. {
  3085.     AstListNode *tail = (AstListNode *) Sym(1);
  3086.  
  3087.     AstListNode *p = AllocateListNode();
  3088.     p -> element = Sym(2);
  3089.     p -> index = tail -> index + 1;
  3090.  
  3091.     p -> next = tail -> next;
  3092.     tail -> next = p;
  3093.  
  3094.     Sym(1) = p;
  3095. }
  3096. ./
  3097.  
  3098. SwitchLabel ::= 'case' ConstantExpression ':'
  3099. \:$action:\
  3100. /.$location
  3101. void Parser::Act$rule_number(void)
  3102. {
  3103.     AstCaseLabel *p = ast_pool -> NewCaseLabel();
  3104.     p -> case_token  = Token(1);
  3105.     p -> expression  = (AstExpression *) Sym(2);
  3106.     p -> colon_token = Token(3);
  3107.     Sym(1) = p;
  3108. }
  3109. ./
  3110.  
  3111. SwitchLabel ::= 'default' ':'
  3112. \:$action:\
  3113. /.$location
  3114. void Parser::Act$rule_number(void)
  3115. {
  3116.     AstDefaultLabel *p = ast_pool -> NewDefaultLabel();
  3117.     p -> default_token = Token(1);
  3118.     p -> colon_token   = Token(2);
  3119.     Sym(1) = p;
  3120. }
  3121. ./
  3122.  
  3123. WhileStatement ::= 'while' '(' Expression ')' Statement
  3124. \:$MakeWhileStatement:\
  3125. /.$location
  3126. void Parser::MakeWhileStatement(void)
  3127. {
  3128.     AstWhileStatement *p = ast_pool -> NewWhileStatement();
  3129.     p -> while_token = Token(1);
  3130.     p -> expression  = (AstExpression *) Sym(3);
  3131.     p -> statement   = (AstStatement *) Sym(5);
  3132.  
  3133.     AstBlock *block = ast_pool -> NewBlock();
  3134.     block -> AllocateBlockStatements(1); // allocate 1 element
  3135.     block -> left_brace_token  = Token(1); // point to 'FOR' keyword
  3136.     block -> AddStatement(p);
  3137.     block -> right_brace_token = Sym(5) -> RightToken(); // point to last token in statement
  3138.  
  3139.     Sym(1) = block;
  3140. }
  3141. ./
  3142.  
  3143. WhileStatementNoShortIf ::= 'while' '(' Expression ')' StatementNoShortIf
  3144. \:$MakeWhileStatement:\
  3145. /.$shared_function
  3146. //
  3147. // void MakeWhileStatement(void);
  3148. //./
  3149.  
  3150. DoStatement ::= 'do' Statement 'while' '(' Expression ')' ';'
  3151. \:$action:\
  3152. /.$location
  3153. void Parser::Act$rule_number(void)
  3154. {
  3155.     AstDoStatement *p = ast_pool -> NewDoStatement();
  3156.     p -> do_token        = Token(1);
  3157.     p -> statement       = (AstStatement *) Sym(2);
  3158.     p -> while_token     = Token(3);
  3159.     p -> expression      = (AstExpression *) Sym(5);
  3160.     p -> semicolon_token = Token(7);
  3161.  
  3162.     AstBlock *block = ast_pool -> NewBlock();
  3163.     block -> AllocateBlockStatements(1); // allocate 1 element
  3164.     block -> left_brace_token  = Token(1);
  3165.     block -> AddStatement(p);
  3166.     block -> right_brace_token = Token(7);
  3167.  
  3168.     Sym(1) = block;
  3169. }
  3170. ./
  3171.  
  3172. ForStatement ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' Statement
  3173. \:$MakeForStatement:\
  3174. /.$location
  3175. void Parser::MakeForStatement(void)
  3176. {
  3177.     AstForStatement *p = ast_pool -> NewForStatement();
  3178.     p -> for_token = Token(1);
  3179.     if (Sym(3) != NULL)
  3180.     {
  3181.         AstListNode *tail = (AstListNode *) Sym(3);
  3182.         p -> AllocateForInitStatements(tail -> index + 1);
  3183.         AstListNode *root = tail;
  3184.         do
  3185.         {
  3186.             root = root -> next;
  3187.             p -> AddForInitStatement((AstStatement *) root -> element);
  3188.         } while(root != tail);
  3189.         FreeCircularList(tail);
  3190.     }
  3191.     p -> end_expression_opt = (AstExpression *) Sym(5);
  3192.     if (Sym(7) != NULL)
  3193.     {
  3194.         AstListNode *tail = (AstListNode *) Sym(7);
  3195.         p -> AllocateForUpdateStatements(tail -> index + 1);
  3196.         AstListNode *root = tail;
  3197.         do
  3198.         {
  3199.             root = root -> next;
  3200.             p -> AddForUpdateStatement((AstExpressionStatement *) root -> element);
  3201.         } while(root != tail);
  3202.         FreeCircularList(tail);
  3203.     }
  3204.     p -> statement = (AstStatement *) Sym(9);
  3205.  
  3206.     AstBlock *block = ast_pool -> NewBlock();
  3207.     block -> AllocateBlockStatements(1); // allocate 1 element
  3208.     block -> left_brace_token  = Token(1);
  3209.     block -> AddStatement(p);
  3210.     block -> right_brace_token = Sym(9) -> RightToken();
  3211.  
  3212.     Sym(1) = block;
  3213. }
  3214. ./
  3215.  
  3216. ForStatementNoShortIf ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' StatementNoShortIf
  3217. \:$MakeForStatement:\
  3218. /.$shared_function
  3219. //
  3220. // void MakeForStatement(void);
  3221. //./
  3222.  
  3223. ForInit -> StatementExpressionList
  3224. \:$NoAction:\
  3225. /.$shared_NoAction./
  3226.  
  3227. ForInit ::= LocalVariableDeclaration
  3228. \:$action:\
  3229. /.$location
  3230. //
  3231. // Note that the list is circular so as to preserve the order of the elements
  3232. //
  3233. void Parser::Act$rule_number(void)
  3234. {
  3235.     AstListNode *p = AllocateListNode();
  3236.     p -> next = p;
  3237.     p -> element = Sym(1);
  3238.     p -> index = 0;
  3239.  
  3240.     Sym(1) = p;
  3241. }
  3242. ./
  3243.  
  3244. ForUpdate -> StatementExpressionList
  3245. \:$NoAction:\
  3246. /.$shared_NoAction./
  3247.  
  3248. StatementExpressionList ::= StatementExpression
  3249. \:$action:\
  3250. /.$location
  3251. //
  3252. // Note that the list is circular so as to preserve the order of the elements
  3253. //
  3254. void Parser::Act$rule_number(void)
  3255. {
  3256.     AstListNode *p = AllocateListNode();
  3257.     p -> next = p;
  3258.     p -> element = Sym(1);
  3259.     p -> index = 0;
  3260.  
  3261.     Sym(1) = p;
  3262. }
  3263. ./
  3264.  
  3265. StatementExpressionList ::= StatementExpressionList ',' StatementExpression
  3266. \:$action:\
  3267. /.$location
  3268. //
  3269. // Note that the list is circular so as to preserve the order of the elements
  3270. //
  3271. void Parser::Act$rule_number(void)
  3272. {
  3273.     AstListNode *tail = (AstListNode *) Sym(1);
  3274.  
  3275.     AstListNode *p = AllocateListNode();
  3276.     p -> element = Sym(3);
  3277.     p -> index = tail -> index + 1;
  3278.  
  3279.     p -> next = tail -> next;
  3280.     tail -> next = p;
  3281.  
  3282.     Sym(1) = p;
  3283. }
  3284. ./
  3285.  
  3286. --
  3287. -- NOTE that the rule Identifieropt was expanded in line in the two
  3288. -- contexts where it appeared: Break and Continue statements.
  3289. -- This was done because there is no straightforward way of passing
  3290. -- optional token information in the parse stack.
  3291. --
  3292. BreakStatement ::= 'break' ';'
  3293. \:$action:\
  3294. /.$location
  3295. void Parser::Act$rule_number(void)
  3296. {
  3297.     AstBreakStatement *p = ast_pool -> NewBreakStatement();
  3298.     p -> break_token          = Token(1);
  3299.     p -> identifier_token_opt = 0;
  3300.     p -> semicolon_token      = Token(2);
  3301.     Sym(1) = p;
  3302. }
  3303. ./
  3304.  
  3305. BreakStatement ::= 'break' 'Identifier' ';'
  3306. \:$action:\
  3307. /.$location
  3308. void Parser::Act$rule_number(void)
  3309. {
  3310.     AstBreakStatement *p = ast_pool -> NewBreakStatement();
  3311.     p -> break_token          = Token(1);
  3312.     p -> identifier_token_opt = Token(2);
  3313.     p -> semicolon_token      = Token(3);
  3314.     Sym(1) = p;
  3315. }
  3316. ./
  3317.  
  3318. ContinueStatement ::= 'continue' ';'
  3319. \:$action:\
  3320. /.$location
  3321. void Parser::Act$rule_number(void)
  3322. {
  3323.     AstContinueStatement *p = ast_pool -> NewContinueStatement();
  3324.     p -> continue_token       = Token(1);
  3325.     p -> identifier_token_opt = 0;
  3326.     p -> semicolon_token      = Token(2);
  3327.     Sym(1) = p;
  3328. }
  3329. ./
  3330.  
  3331. ContinueStatement ::= 'continue' 'Identifier' ';'
  3332. \:$action:\
  3333. /.$location
  3334. void Parser::Act$rule_number(void)
  3335. {
  3336.     AstContinueStatement *p = ast_pool -> NewContinueStatement();
  3337.     p -> continue_token       = Token(1);
  3338.     p -> identifier_token_opt = Token(2);
  3339.     p -> semicolon_token      = Token(3);
  3340.     Sym(1) = p;
  3341. }
  3342. ./
  3343.  
  3344. ReturnStatement ::= 'return' Expressionopt ';'
  3345. \:$action:\
  3346. /.$location
  3347. void Parser::Act$rule_number(void)
  3348. {
  3349.     AstReturnStatement *p = ast_pool -> NewReturnStatement();
  3350.     p -> return_token    = Token(1);
  3351.     p -> expression_opt  = (AstExpression *) Sym(2);
  3352.     p -> semicolon_token = Token(3);
  3353.     Sym(1) = p;
  3354. }
  3355. ./
  3356.  
  3357. ThrowStatement ::= 'throw' Expression ';'
  3358. \:$action:\
  3359. /.$location
  3360. void Parser::Act$rule_number(void)
  3361. {
  3362.     AstThrowStatement *p = ast_pool -> NewThrowStatement();
  3363.     p -> throw_token     = Token(1);
  3364.     p -> expression      = (AstExpression *) Sym(2);
  3365.     p -> semicolon_token = Token(3);
  3366.     Sym(1) = p;
  3367. }
  3368. ./
  3369.  
  3370. SynchronizedStatement ::= 'synchronized' '(' Expression ')' Block
  3371. \:$action:\
  3372. /.$location
  3373. void Parser::Act$rule_number(void)
  3374. {
  3375.     AstSynchronizedStatement *p = ast_pool -> NewSynchronizedStatement();
  3376.     p -> synchronized_token = Token(1);
  3377.     p -> expression         = (AstExpression *) Sym(3);
  3378.     p -> block              = (AstBlock *) Sym(5);
  3379.     Sym(1) = p;
  3380. }
  3381. ./
  3382.  
  3383. TryStatement ::= 'try' Block Catches
  3384. \:$action:\
  3385. /.$location
  3386. void Parser::Act$rule_number(void)
  3387. {
  3388.     AstTryStatement *p = ast_pool -> NewTryStatement();
  3389.     p -> try_token          = Token(1);
  3390.     p -> block              = (AstBlock *) Sym(2);
  3391.     //
  3392.     // The list of modifiers is guaranteed not empty
  3393.     //
  3394.     {
  3395.         AstListNode *tail = (AstListNode *) Sym(3);
  3396.         p -> AllocateCatchClauses(tail -> index + 1);
  3397.         AstListNode *root = tail;
  3398.         do
  3399.         {
  3400.             root = root -> next;
  3401.             p -> AddCatchClause((AstCatchClause *) root -> element);
  3402.         } while(root != tail);
  3403.         FreeCircularList(tail);
  3404.     }
  3405.     p -> finally_clause_opt = NULL;
  3406.     Sym(1) = p;
  3407. }
  3408. ./
  3409.  
  3410. TryStatement ::= 'try' Block Catchesopt Finally
  3411. \:$action:\
  3412. /.$location
  3413. void Parser::Act$rule_number(void)
  3414. {
  3415.     AstTryStatement *p = ast_pool -> NewTryStatement();
  3416.     p -> try_token      = Token(1);
  3417.     p -> block          = (AstBlock *) Sym(2);
  3418.     if (Sym(3) != NULL)
  3419.     {
  3420.         AstListNode *tail = (AstListNode *) Sym(3);
  3421.         p -> AllocateCatchClauses(tail -> index + 1);
  3422.         AstListNode *root = tail;
  3423.         do
  3424.         {
  3425.             root = root -> next;
  3426.             p -> AddCatchClause((AstCatchClause *) root -> element);
  3427.         } while(root != tail);
  3428.         FreeCircularList(tail);
  3429.     }
  3430.     p -> finally_clause_opt = (AstFinallyClause *) Sym(4);
  3431.     Sym(1) = p;
  3432. }
  3433. ./
  3434.  
  3435. Catches ::= CatchClause
  3436. \:$action:\
  3437. /.$location
  3438. //
  3439. // Note that the list is circular so as to preserve the order of the elements
  3440. //
  3441. void Parser::Act$rule_number(void)
  3442. {
  3443.     AstListNode *p = AllocateListNode();
  3444.     p -> next = p;
  3445.     p -> element = Sym(1);
  3446.     p -> index = 0;
  3447.  
  3448.     Sym(1) = p;
  3449. }
  3450. ./
  3451.  
  3452. Catches ::= Catches CatchClause
  3453. \:$action:\
  3454. /.$location
  3455. //
  3456. // Note that the list is circular so as to preserve the order of the elements
  3457. //
  3458. void Parser::Act$rule_number(void)
  3459. {
  3460.     AstListNode *tail = (AstListNode *) Sym(1);
  3461.  
  3462.     AstListNode *p = AllocateListNode();
  3463.     p -> element = Sym(2);
  3464.     p -> index = tail -> index + 1;
  3465.  
  3466.     p -> next = tail -> next;
  3467.     tail -> next = p;
  3468.  
  3469.     Sym(1) = p;
  3470. }
  3471. ./
  3472.  
  3473. CatchClause ::= 'catch' '(' FormalParameter ')' Block
  3474. \:$action:\
  3475. /.$location
  3476. void Parser::Act$rule_number(void)
  3477. {
  3478.     AstCatchClause *p = ast_pool -> NewCatchClause();
  3479.     p -> catch_token      = Token(1);
  3480.     p -> formal_parameter = (AstFormalParameter *) Sym(3);
  3481.     p -> block            = (AstBlock *) Sym(5);
  3482.     Sym(1) = p;
  3483. }
  3484. ./
  3485.  
  3486. Finally ::= 'finally' Block
  3487. \:$action:\
  3488. /.$location
  3489. void Parser::Act$rule_number(void)
  3490. {
  3491.     AstFinallyClause *p = ast_pool -> NewFinallyClause();
  3492.     p -> finally_token = Token(1);
  3493.     p -> block         = (AstBlock *) Sym(2);
  3494.     Sym(1) = p;
  3495. }
  3496. ./
  3497.  
  3498. --18.12 Productions from 14: Expressions
  3499.  
  3500. Primary -> PrimaryNoNewArray
  3501. \:$NoAction:\
  3502. /.$shared_NoAction./
  3503.  
  3504. Primary -> ArrayCreationExpression
  3505. \:$NoAction:\
  3506. /.$shared_NoAction./
  3507.  
  3508. PrimaryNoNewArray -> Literal
  3509. \:$NoAction:\
  3510. /.$shared_NoAction./
  3511.  
  3512. PrimaryNoNewArray ::= this
  3513. \:$action:\
  3514. /.$location
  3515. void Parser::Act$rule_number(void)
  3516. {
  3517.     Sym(1) = ast_pool -> NewThisExpression(Token(1));
  3518. }
  3519. ./
  3520.  
  3521. PrimaryNoNewArray ::= '(' Expression ')'
  3522. \:$action:\
  3523. /.$location
  3524. void Parser::Act$rule_number(void)
  3525. {
  3526.     AstParenthesizedExpression *p = ast_pool -> NewParenthesizedExpression();
  3527.     p -> left_parenthesis_token = Token(1);
  3528.     p -> expression = (AstExpression *) Sym(2);
  3529.     p -> right_parenthesis_token = Token(3);
  3530.     Sym(1) = p;
  3531. }
  3532. ./
  3533.  
  3534. PrimaryNoNewArray -> ClassInstanceCreationExpression
  3535. \:$NoAction:\
  3536. /.$shared_NoAction./
  3537.  
  3538. PrimaryNoNewArray -> FieldAccess
  3539. \:$NoAction:\
  3540. /.$shared_NoAction./
  3541.  
  3542. --1.1 feature
  3543. PrimaryNoNewArray ::= Name '.' 'this'
  3544. \:$action:\
  3545. /.$location
  3546. void Parser::Act$rule_number(void)
  3547. {
  3548.     AstFieldAccess *p = ast_pool -> NewFieldAccess(AstFieldAccess::THIS_TAG);
  3549.     p -> base = (AstExpression *) Sym(1);
  3550.     p -> dot_token = Token(2);
  3551.     p -> identifier_token = Token(3);
  3552.     Sym(1) = p;
  3553. }
  3554. ./
  3555.  
  3556. --1.1 feature
  3557. PrimaryNoNewArray ::= Type '.' 'class'
  3558. \:$action:\
  3559. /.$location
  3560. void Parser::Act$rule_number(void)
  3561. {
  3562.     AstFieldAccess *p = ast_pool -> NewFieldAccess(AstFieldAccess::CLASS_TAG);
  3563.     p -> base = ast_pool -> NewTypeExpression(Sym(1));
  3564.     p -> dot_token = Token(2);
  3565.     p -> identifier_token = Token(3);
  3566.     Sym(1) = p;
  3567. }
  3568. ./
  3569.  
  3570. --1.1 feature
  3571. PrimaryNoNewArray ::= 'void' '.' 'class'
  3572. \:$action:\
  3573. /.$location
  3574. void Parser::Act$rule_number(void)
  3575. {
  3576.     AstFieldAccess *p = ast_pool -> NewFieldAccess(AstFieldAccess::CLASS_TAG);
  3577.     p -> base = ast_pool -> NewTypeExpression(ast_pool -> NewPrimitiveType(Ast::VOID_TYPE, Token(1)));
  3578.     p -> dot_token = Token(2);
  3579.     p -> identifier_token = Token(3);
  3580.     Sym(1) = p;
  3581. }
  3582. ./
  3583.  
  3584. PrimaryNoNewArray -> MethodInvocation
  3585. \:$NoAction:\
  3586. /.$shared_NoAction./
  3587.  
  3588. PrimaryNoNewArray -> ArrayAccess
  3589. \:$NoAction:\
  3590. /.$shared_NoAction./
  3591.  
  3592. --1.1 feature
  3593. --
  3594. -- In Java 1.0 a ClassBody could not appear at all in a
  3595. -- ClassInstanceCreationExpression.
  3596. --
  3597. ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
  3598. \:$action:\
  3599. /.$location
  3600. void Parser::Act$rule_number(void)
  3601. {
  3602.     AstClassInstanceCreationExpression *p = ast_pool -> NewClassInstanceCreationExpression();
  3603.     p -> base_opt                = NULL;
  3604.     p -> dot_token_opt           = 0;
  3605.     p -> new_token               = Token(1);
  3606.     p -> class_type              = ast_pool -> NewTypeExpression(Sym(2));
  3607.     p -> left_parenthesis_token  = Token(3);
  3608.     if (Sym(4) != NULL)
  3609.     {
  3610.         AstListNode *tail = (AstListNode *) Sym(4);
  3611.         p -> AllocateArguments(tail -> index + 1);
  3612.         AstListNode *root = tail;
  3613.         do
  3614.         {
  3615.             root = root -> next;
  3616.             p -> AddArgument((AstExpression *) root -> element);
  3617.         } while(root != tail);
  3618.         FreeCircularList(tail);
  3619.     }
  3620.     p -> right_parenthesis_token = Token(5);
  3621.     p -> class_body_opt          = (AstClassBody *) Sym(6);
  3622.     Sym(1) = p;
  3623. }
  3624. ./
  3625.  
  3626. --1.1 feature
  3627. ClassInstanceCreationExpression ::= Primary '.' 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
  3628. \:$MakeQualifiedNew:\
  3629. /.$location
  3630. void Parser::MakeQualifiedNew(void)
  3631. {
  3632.     AstClassInstanceCreationExpression *p = ast_pool -> NewClassInstanceCreationExpression();
  3633.     p -> base_opt                = (AstExpression *) Sym(1);
  3634.     p -> dot_token_opt           = Token(2);
  3635.     p -> new_token               = Token(3);
  3636.     p -> class_type              = ast_pool -> NewTypeExpression(Sym(4));
  3637.     p -> left_parenthesis_token  = Token(5);
  3638.     if (Sym(6) != NULL)
  3639.     {
  3640.         AstListNode *tail = (AstListNode *) Sym(6);
  3641.         p -> AllocateArguments(tail -> index + 1);
  3642.         AstListNode *root = tail;
  3643.         do
  3644.         {
  3645.             root = root -> next;
  3646.             p -> AddArgument((AstExpression *) root -> element);
  3647.         } while(root != tail);
  3648.         FreeCircularList(tail);
  3649.     }
  3650.     p -> right_parenthesis_token = Token(7);
  3651.     p -> class_body_opt          = (AstClassBody *) Sym(8);
  3652.     Sym(1) = p;
  3653. }
  3654. ./
  3655.  
  3656. --1.1 feature
  3657. ClassInstanceCreationExpression ::= Name '.' 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
  3658. \:$MakeQualifiedNew:\
  3659. /.$shared_function
  3660. //
  3661. // void MakeQualifiedNew(void);
  3662. //./
  3663.  
  3664. ArgumentList ::= Expression
  3665. \:$action:\
  3666. /.$location
  3667. //
  3668. // Note that the list is circular so as to preserve the order of the elements
  3669. //
  3670. void Parser::Act$rule_number(void)
  3671. {
  3672.     AstListNode *p = AllocateListNode();
  3673.     p -> next = p;
  3674.     p -> element = Sym(1);
  3675.     p -> index = 0;
  3676.  
  3677.     Sym(1) = p;
  3678. }
  3679. ./
  3680.  
  3681. ArgumentList ::= ArgumentList ',' Expression
  3682. \:$action:\
  3683. /.$location
  3684. //
  3685. // Note that the list is circular so as to preserve the order of the elements
  3686. //
  3687. void Parser::Act$rule_number(void)
  3688. {
  3689.     AstListNode *tail = (AstListNode *) Sym(1);
  3690.  
  3691.     AstListNode *p = AllocateListNode();
  3692.     p -> element = Sym(3);
  3693.     p -> index = tail -> index + 1;
  3694.  
  3695.     p -> next = tail -> next;
  3696.     tail -> next = p;
  3697.  
  3698.     Sym(1) = p;
  3699. }
  3700. ./
  3701.  
  3702. ArrayCreationExpression ::= 'new' PrimitiveType DimExprs Dimsopt
  3703. \:$MakeArrayCreationExpression:\
  3704. /.$location
  3705. void Parser::MakeArrayCreationExpression(void)
  3706. {
  3707.     AstArrayCreationExpression *p = ast_pool -> NewArrayCreationExpression();
  3708.     p -> new_token             = Token(1);
  3709.     p -> array_type            = Sym(2);
  3710.     //
  3711.     // The list of DimExprs is never null
  3712.     //
  3713.     {
  3714.         AstListNode *tail = (AstListNode *) Sym(3);
  3715.         p -> AllocateDimExprs(tail -> index + 1);
  3716.         AstListNode *root = tail;
  3717.         do
  3718.         {
  3719.             root = root -> next;
  3720.             p -> AddDimExpr((AstDimExpr *) root -> element);
  3721.         } while(root != tail);
  3722.         FreeCircularList(tail);
  3723.     }
  3724.  
  3725.     if (Sym(4) != NULL)
  3726.     {
  3727.         AstListNode *tail = (AstListNode *) Sym(4);
  3728.         p -> AllocateBrackets(tail -> index + 1);
  3729.         AstListNode *root = tail;
  3730.         do
  3731.         {
  3732.             root = root -> next;
  3733.             p -> AddBrackets((AstBrackets *) root -> element);
  3734.         } while(root != tail);
  3735.         FreeCircularList(tail);
  3736.     }
  3737.     p -> array_initializer_opt = NULL;
  3738.     Sym(1) = p;
  3739. }
  3740. ./
  3741.  
  3742. ArrayCreationExpression ::= 'new' ClassOrInterfaceType DimExprs Dimsopt
  3743. \:$MakeArrayCreationExpression:\
  3744. /.$shared_function
  3745. //
  3746. // void MakeArrayCreationExpression(void);
  3747. //./
  3748.  
  3749. --1.1 feature
  3750. ArrayCreationExpression ::= 'new' ArrayType ArrayInitializer
  3751. \:$action:\
  3752. /.$location
  3753. void Parser::Act$rule_number(void)
  3754. {
  3755.     AstArrayCreationExpression *p = ast_pool -> NewArrayCreationExpression();
  3756.     p -> new_token             = Token(1);
  3757.     p -> array_type            = Sym(2);
  3758.     p -> array_initializer_opt = (AstArrayInitializer *) Sym(3);
  3759.     Sym(1) = p;
  3760. }
  3761. ./
  3762.  
  3763. DimExprs ::= DimExpr
  3764. \:$action:\
  3765. /.$location
  3766. //
  3767. // Note that the list is circular so as to preserve the order of the elements
  3768. //
  3769. void Parser::Act$rule_number(void)
  3770. {
  3771.     AstListNode *p = AllocateListNode();
  3772.     p -> next = p;
  3773.     p -> element = Sym(1);
  3774.     p -> index = 0;
  3775.  
  3776.     Sym(1) = p;
  3777. }
  3778. ./
  3779.  
  3780. DimExprs ::= DimExprs DimExpr
  3781. \:$action:\
  3782. /.$location
  3783. //
  3784. // Note that the list is circular so as to preserve the order of the elements
  3785. //
  3786. void Parser::Act$rule_number(void)
  3787. {
  3788.     AstListNode *tail = (AstListNode *) Sym(1);
  3789.  
  3790.     AstListNode *p = AllocateListNode();
  3791.     p -> element = Sym(2);
  3792.     p -> index = tail -> index + 1;
  3793.  
  3794.     p -> next = tail -> next;
  3795.     tail -> next = p;
  3796.  
  3797.     Sym(1) = p;
  3798. }
  3799. ./
  3800.  
  3801. DimExpr ::= '[' Expression ']'
  3802. \:$action:\
  3803. /.$location
  3804. void Parser::Act$rule_number(void)
  3805. {
  3806.     AstDimExpr *p = ast_pool -> NewDimExpr();
  3807.     p -> left_bracket_token  = Token(1);
  3808.     p -> expression          = (AstExpression *) Sym(2);
  3809.     p -> right_bracket_token = Token(3);
  3810.     Sym(1) = p;
  3811. }
  3812. ./
  3813.  
  3814. Dims ::= '[' ']'
  3815. \:$action:\
  3816. /.$location
  3817. //
  3818. // Note that the list is circular so as to preserve the order of the elements
  3819. //
  3820. void Parser::Act$rule_number(void)
  3821. {
  3822.     AstListNode *p = AllocateListNode();
  3823.     p -> next = p;
  3824.     p -> element = ast_pool -> NewBrackets(Token(1), Token(2));
  3825.     p -> index = 0;
  3826.  
  3827.     Sym(1) = p;
  3828. }
  3829. ./
  3830.  
  3831. Dims ::= Dims '[' ']'
  3832. \:$action:\
  3833. /.$location
  3834. //
  3835. // Note that the list is circular so as to preserve the order of the elements
  3836. //
  3837. void Parser::Act$rule_number(void)
  3838. {
  3839.     AstListNode *tail = (AstListNode *) Sym(1);
  3840.  
  3841.     AstListNode *p = AllocateListNode();
  3842.     p -> element = ast_pool -> NewBrackets(Token(2), Token(3));
  3843.     p -> index = tail -> index + 1;
  3844.  
  3845.     p -> next = tail -> next;
  3846.     tail -> next = p;
  3847.  
  3848.     Sym(1) = p;
  3849. }
  3850. ./
  3851.  
  3852. FieldAccess ::= Primary '.' 'Identifier'
  3853. \:$MakeFieldAccess:\
  3854. /.$shared_function
  3855. //
  3856. // void MakeFieldAccess(void);
  3857. //./
  3858.  
  3859. FieldAccess ::= 'super' '.' 'Identifier'
  3860. \:$MakeSuperFieldAccess:\
  3861. /.$location
  3862. void Parser::MakeSuperFieldAccess(void)
  3863. {
  3864.     Sym(1) = ast_pool -> NewSuperExpression(Token(1));
  3865.  
  3866.     MakeFieldAccess();
  3867. }
  3868. ./
  3869.  
  3870. --1.2 feature
  3871. FieldAccess ::= Name '.' 'super' '.' 'Identifier'
  3872. \:$MakeSuperDoubleFieldAccess:\
  3873. /.$location
  3874. void Parser::MakeSuperDoubleFieldAccess(void)
  3875. {
  3876.     AstFieldAccess *p = ast_pool -> NewFieldAccess();
  3877.  
  3878.          AstFieldAccess *q = ast_pool -> NewFieldAccess(AstFieldAccess::SUPER_TAG);
  3879.          q -> base = (AstExpression *) Sym(1);
  3880.          q -> dot_token = Token(2);
  3881.          q -> identifier_token = Token(3);
  3882.  
  3883.     p -> base = q;
  3884.     p -> dot_token = Token(4);
  3885.     p -> identifier_token = Token(5);
  3886.  
  3887.     Sym(1) = p;
  3888. }
  3889. ./
  3890.  
  3891. MethodInvocation ::= Name '(' ArgumentListopt ')'
  3892. \:$action:\
  3893. /.$location
  3894. void Parser::Act$rule_number(void)
  3895. {
  3896.     AstMethodInvocation *p = ast_pool -> NewMethodInvocation();
  3897.     p -> method                  = (AstExpression *) Sym(1);
  3898.     p -> left_parenthesis_token  = Token(2);
  3899.     if (Sym(3) != NULL)
  3900.     {
  3901.         AstListNode *tail = (AstListNode *) Sym(3);
  3902.         p -> AllocateArguments(tail -> index + 1);
  3903.         AstListNode *root = tail;
  3904.         do
  3905.         {
  3906.             root = root -> next;
  3907.             p -> AddArgument((AstExpression *) root -> element);
  3908.         } while(root != tail);
  3909.         FreeCircularList(tail);
  3910.     }
  3911.     p -> right_parenthesis_token = Token(4);
  3912.     Sym(1) = p;
  3913. }
  3914. ./
  3915.  
  3916. MethodInvocation ::= Primary '.' 'Identifier' '(' ArgumentListopt ')'
  3917. \:$action:\
  3918. /.$location
  3919. void Parser::Act$rule_number(void)
  3920. {
  3921.     MakeFieldAccess();
  3922.  
  3923.     AstMethodInvocation *p = ast_pool -> NewMethodInvocation();
  3924.     p -> method                  = (AstExpression *) Sym(1);
  3925.     p -> left_parenthesis_token  = Token(4);
  3926.     if (Sym(5) != NULL)
  3927.     {
  3928.         AstListNode *tail = (AstListNode *) Sym(5);
  3929.         p -> AllocateArguments(tail -> index + 1);
  3930.         AstListNode *root = tail;
  3931.         do
  3932.         {
  3933.             root = root -> next;
  3934.             p -> AddArgument((AstExpression *) root -> element);
  3935.         } while(root != tail);
  3936.         FreeCircularList(tail);
  3937.     }
  3938.     p -> right_parenthesis_token = Token(6);
  3939.     Sym(1) = p;
  3940. }
  3941. ./
  3942.  
  3943. MethodInvocation ::= 'super' '.' 'Identifier' '(' ArgumentListopt ')'
  3944. \:$action:\
  3945. /.$location
  3946. void Parser::Act$rule_number(void)
  3947. {
  3948.     MakeSuperFieldAccess();
  3949.  
  3950.     AstMethodInvocation *p = ast_pool -> NewMethodInvocation();
  3951.     p -> method                  = (AstExpression *) Sym(1);
  3952.     p -> left_parenthesis_token  = Token(4);
  3953.     if (Sym(5) != NULL)
  3954.     {
  3955.         AstListNode *tail = (AstListNode *) Sym(5);
  3956.         p -> AllocateArguments(tail -> index + 1);
  3957.         AstListNode *root = tail;
  3958.         do
  3959.         {
  3960.             root = root -> next;
  3961.             p -> AddArgument((AstExpression *) root -> element);
  3962.         } while(root != tail);
  3963.         FreeCircularList(tail);
  3964.     }
  3965.     p -> right_parenthesis_token = Token(6);
  3966.     Sym(1) = p;
  3967. }
  3968. ./
  3969.  
  3970. --1.2 feature
  3971. MethodInvocation ::= Name '.' 'super' '.' 'Identifier' '(' ArgumentListopt ')'
  3972. \:$action:\
  3973. /.$location
  3974. void Parser::Act$rule_number(void)
  3975. {
  3976.     MakeSuperDoubleFieldAccess();
  3977.  
  3978.     AstMethodInvocation *p = ast_pool -> NewMethodInvocation();
  3979.     p -> method                  = (AstExpression *) Sym(1);
  3980.     p -> left_parenthesis_token  = Token(6);
  3981.     if (Sym(7) != NULL)
  3982.     {
  3983.         AstListNode *tail = (AstListNode *) Sym(7);
  3984.         p -> AllocateArguments(tail -> index + 1);
  3985.         AstListNode *root = tail;
  3986.         do
  3987.         {
  3988.             root = root -> next;
  3989.             p -> AddArgument((AstExpression *) root -> element);
  3990.         } while(root != tail);
  3991.         FreeCircularList(tail);
  3992.     }
  3993.     p -> right_parenthesis_token = Token(8);
  3994.     Sym(1) = p;
  3995. }
  3996. ./
  3997.  
  3998. ArrayAccess ::= Name '[' Expression ']'
  3999. \:$MakeArrayAccess:\
  4000. /.$location
  4001. void Parser::MakeArrayAccess(void)
  4002. {
  4003.     AstArrayAccess *p = ast_pool -> NewArrayAccess();
  4004.     p -> base                = (AstExpression *) Sym(1);
  4005.     p -> left_bracket_token  = Token(2);
  4006.     p -> expression          = (AstExpression *) Sym(3);
  4007.     p -> right_bracket_token = Token(4);
  4008.     Sym(1) = p;
  4009. }
  4010. ./
  4011.  
  4012. ArrayAccess ::= PrimaryNoNewArray '[' Expression ']'
  4013. \:$MakeArrayAccess:\
  4014. /.$shared_function
  4015. //
  4016. // void MakeArrayAccess(void);
  4017. //./
  4018.  
  4019. PostfixExpression -> Primary
  4020. \:$NoAction:\
  4021. /.$shared_NoAction./
  4022.  
  4023. PostfixExpression -> Name
  4024. \:$NoAction:\
  4025. /.$shared_NoAction./
  4026.  
  4027. PostfixExpression -> PostIncrementExpression
  4028. \:$NoAction:\
  4029. /.$shared_NoAction./
  4030.  
  4031. PostfixExpression -> PostDecrementExpression
  4032. \:$NoAction:\
  4033. /.$shared_NoAction./
  4034.  
  4035. PostIncrementExpression ::= PostfixExpression '++'
  4036. \:$action:\
  4037. /.$location
  4038. void Parser::Act$rule_number(void)
  4039. {
  4040.     AstPostUnaryExpression *p = ast_pool -> NewPostUnaryExpression(AstPostUnaryExpression::PLUSPLUS);
  4041.     p -> expression          = (AstExpression *) Sym(1);
  4042.     p -> post_operator_token = Token(2);
  4043.     Sym(1) = p;
  4044. }
  4045. ./
  4046.  
  4047. PostDecrementExpression ::= PostfixExpression '--'
  4048. \:$action:\
  4049. /.$location
  4050. void Parser::Act$rule_number(void)
  4051. {
  4052.     AstPostUnaryExpression *p = ast_pool -> NewPostUnaryExpression(AstPostUnaryExpression::MINUSMINUS);
  4053.     p -> expression          = (AstExpression *) Sym(1);
  4054.     p -> post_operator_token = Token(2);
  4055.     Sym(1) = p;
  4056. }
  4057. ./
  4058.  
  4059. UnaryExpression -> PreIncrementExpression
  4060. \:$NoAction:\
  4061. /.$shared_NoAction./
  4062.  
  4063. UnaryExpression -> PreDecrementExpression
  4064. \:$NoAction:\
  4065. /.$shared_NoAction./
  4066.  
  4067. UnaryExpression ::= '+' UnaryExpression
  4068. \:$action:\
  4069. /.$location
  4070. void Parser::Act$rule_number(void)
  4071. {
  4072.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::PLUS);
  4073.     p -> pre_operator_token = Token(1);
  4074.     p -> expression         = (AstExpression *) Sym(2);
  4075.     Sym(1) = p;
  4076. }
  4077. ./
  4078.  
  4079. UnaryExpression ::= '-' UnaryExpression
  4080. \:$action:\
  4081. /.$location
  4082. void Parser::Act$rule_number(void)
  4083. {
  4084.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::MINUS);
  4085.     p -> pre_operator_token = Token(1);
  4086.     p -> expression         = (AstExpression *) Sym(2);
  4087.     Sym(1) = p;
  4088. }
  4089. ./
  4090.  
  4091. UnaryExpression -> UnaryExpressionNotPlusMinus
  4092. \:$NoAction:\
  4093. /.$shared_NoAction./
  4094.  
  4095. PreIncrementExpression ::= '++' UnaryExpression
  4096. \:$action:\
  4097. /.$location
  4098. void Parser::Act$rule_number(void)
  4099. {
  4100.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::PLUSPLUS);
  4101.     p -> pre_operator_token = Token(1);
  4102.     p -> expression         = (AstExpression *) Sym(2);
  4103.     Sym(1) = p;
  4104. }
  4105. ./
  4106.  
  4107. PreDecrementExpression ::= '--' UnaryExpression
  4108. \:$action:\
  4109. /.$location
  4110. void Parser::Act$rule_number(void)
  4111. {
  4112.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::MINUSMINUS);
  4113.     p -> pre_operator_token = Token(1);
  4114.     p -> expression         = (AstExpression *) Sym(2);
  4115.     Sym(1) = p;
  4116. }
  4117. ./
  4118.  
  4119. UnaryExpressionNotPlusMinus -> PostfixExpression
  4120. \:$NoAction:\
  4121. /.$shared_NoAction./
  4122.  
  4123. UnaryExpressionNotPlusMinus ::= '~' UnaryExpression
  4124. \:$action:\
  4125. /.$location
  4126. void Parser::Act$rule_number(void)
  4127. {
  4128.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::TWIDDLE);
  4129.     p -> pre_operator_token = Token(1);
  4130.     p -> expression         = (AstExpression *) Sym(2);
  4131.     Sym(1) = p;
  4132. }
  4133. ./
  4134.  
  4135. UnaryExpressionNotPlusMinus ::= '!' UnaryExpression
  4136. \:$action:\
  4137. /.$location
  4138. void Parser::Act$rule_number(void)
  4139. {
  4140.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::NOT);
  4141.     p -> pre_operator_token = Token(1);
  4142.     p -> expression         = (AstExpression *) Sym(2);
  4143.     Sym(1) = p;
  4144. }
  4145. ./
  4146.  
  4147. UnaryExpressionNotPlusMinus -> CastExpression
  4148. \:$NoAction:\
  4149. /.$shared_NoAction./
  4150.  
  4151. CastExpression ::= '(' PrimitiveType Dimsopt ')' UnaryExpression
  4152. \:$MakeCastExpression:\
  4153. /.$location
  4154. void Parser::MakeCastExpression(void)
  4155. {
  4156.     AstCastExpression *p = ast_pool -> NewCastExpression();
  4157.     p -> left_parenthesis_token_opt  = Token(1);
  4158.     p -> type_opt                    = Sym(2);
  4159.     if (Sym(3) != NULL)
  4160.     {
  4161.         AstListNode *tail = (AstListNode *) Sym(3);
  4162.         p -> AllocateBrackets(tail -> index + 1);
  4163.         AstListNode *root = tail;
  4164.         do
  4165.         {
  4166.             root = root -> next;
  4167.             p -> AddBrackets((AstBrackets *) root -> element);
  4168.         } while(root != tail);
  4169.         FreeCircularList(tail);
  4170.     }
  4171.     p -> right_parenthesis_token_opt = Token(4);
  4172.     p -> expression                  = (AstExpression *) Sym(5);
  4173.     Sym(1) = p;
  4174. }
  4175. ./
  4176.  
  4177. CastExpression ::= '(' Expression ')' UnaryExpressionNotPlusMinus
  4178. \:$action:\
  4179. /.$location
  4180. void Parser::Act$rule_number(void)
  4181.     //
  4182.     // Note that Expression must be a name - i.e., Sym(2) -> isName() == true
  4183.     // This check is not performed here and should be performed during
  4184.     // semantic processing.
  4185.     //
  4186.     AstCastExpression *p = ast_pool -> NewCastExpression();
  4187.     p -> left_parenthesis_token_opt  = Token(1);
  4188.     p -> type_opt                    = Sym(2);
  4189.     p -> right_parenthesis_token_opt = Token(3);
  4190.     p -> expression                  = (AstExpression *) Sym(4);
  4191.     Sym(1) = p;
  4192. }
  4193. ./
  4194.  
  4195. CastExpression ::= '(' Name Dims ')' UnaryExpressionNotPlusMinus
  4196. \:$MakeCastExpression:\
  4197. /.$shared_function
  4198. //
  4199. // void MakeCastExpression(void);
  4200. //./
  4201.  
  4202. MultiplicativeExpression -> UnaryExpression
  4203. \:$NoAction:\
  4204. /.$shared_NoAction./
  4205.  
  4206. MultiplicativeExpression ::= MultiplicativeExpression '*' UnaryExpression
  4207. \:$action:\
  4208. /.$location
  4209. void Parser::Act$rule_number(void)
  4210. {
  4211.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::STAR);
  4212.     p -> left_expression       = (AstExpression *) Sym(1);
  4213.     p -> binary_operator_token = Token(2);
  4214.     p -> right_expression      = (AstExpression *) Sym(3);
  4215.     Sym(1) = p;
  4216. }
  4217. ./
  4218.  
  4219. MultiplicativeExpression ::= MultiplicativeExpression '/' UnaryExpression
  4220. \:$action:\
  4221. /.$location
  4222. void Parser::Act$rule_number(void)
  4223. {
  4224.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::SLASH);
  4225.     p -> left_expression       = (AstExpression *) Sym(1);
  4226.     p -> binary_operator_token = Token(2);
  4227.     p -> right_expression      = (AstExpression *) Sym(3);
  4228.     Sym(1) = p;
  4229. }
  4230. ./
  4231.  
  4232. MultiplicativeExpression ::= MultiplicativeExpression '%' UnaryExpression
  4233. \:$action:\
  4234. /.$location
  4235. void Parser::Act$rule_number(void)
  4236. {
  4237.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::MOD);
  4238.     p -> left_expression       = (AstExpression *) Sym(1);
  4239.     p -> binary_operator_token = Token(2);
  4240.     p -> right_expression      = (AstExpression *) Sym(3);
  4241.     Sym(1) = p;
  4242. }
  4243. ./
  4244.  
  4245. AdditiveExpression -> MultiplicativeExpression
  4246. \:$NoAction:\
  4247. /.$shared_NoAction./
  4248.  
  4249. AdditiveExpression ::= AdditiveExpression '+' MultiplicativeExpression
  4250. \:$action:\
  4251. /.$location
  4252. void Parser::Act$rule_number(void)
  4253. {
  4254.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::PLUS);
  4255.     p -> left_expression       = (AstExpression *) Sym(1);
  4256.     p -> binary_operator_token = Token(2);
  4257.     p -> right_expression      = (AstExpression *) Sym(3);
  4258.     Sym(1) = p;
  4259. }
  4260. ./
  4261.  
  4262. AdditiveExpression ::= AdditiveExpression '-' MultiplicativeExpression
  4263. \:$action:\
  4264. /.$location
  4265. void Parser::Act$rule_number(void)
  4266. {
  4267.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::MINUS);
  4268.     p -> left_expression       = (AstExpression *) Sym(1);
  4269.     p -> binary_operator_token = Token(2);
  4270.     p -> right_expression      = (AstExpression *) Sym(3);
  4271.     Sym(1) = p;
  4272. }
  4273. ./
  4274.  
  4275. ShiftExpression -> AdditiveExpression
  4276. \:$NoAction:\
  4277. /.$shared_NoAction./
  4278.  
  4279. ShiftExpression ::= ShiftExpression '<<'  AdditiveExpression
  4280. \:$action:\
  4281. /.$location
  4282. void Parser::Act$rule_number(void)
  4283. {
  4284.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::LEFT_SHIFT);
  4285.     p -> left_expression       = (AstExpression *) Sym(1);
  4286.     p -> binary_operator_token = Token(2);
  4287.     p -> right_expression      = (AstExpression *) Sym(3);
  4288.     Sym(1) = p;
  4289. }
  4290. ./
  4291.  
  4292. ShiftExpression ::= ShiftExpression '>>'  AdditiveExpression
  4293. \:$action:\
  4294. /.$location
  4295. void Parser::Act$rule_number(void)
  4296. {
  4297.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::RIGHT_SHIFT);
  4298.     p -> left_expression       = (AstExpression *) Sym(1);
  4299.     p -> binary_operator_token = Token(2);
  4300.     p -> right_expression      = (AstExpression *) Sym(3);
  4301.     Sym(1) = p;
  4302. }
  4303. ./
  4304.  
  4305. ShiftExpression ::= ShiftExpression '>>>' AdditiveExpression
  4306. \:$action:\
  4307. /.$location
  4308. void Parser::Act$rule_number(void)
  4309. {
  4310.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::UNSIGNED_RIGHT_SHIFT);
  4311.     p -> left_expression       = (AstExpression *) Sym(1);
  4312.     p -> binary_operator_token = Token(2);
  4313.     p -> right_expression      = (AstExpression *) Sym(3);
  4314.     Sym(1) = p;
  4315. }
  4316. ./
  4317.  
  4318. RelationalExpression -> ShiftExpression
  4319. \:$NoAction:\
  4320. /.$shared_NoAction./
  4321.  
  4322. RelationalExpression ::= RelationalExpression '<'  ShiftExpression
  4323. \:$action:\
  4324. /.$location
  4325. void Parser::Act$rule_number(void)
  4326. {
  4327.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::LESS);
  4328.     p -> left_expression       = (AstExpression *) Sym(1);
  4329.     p -> binary_operator_token = Token(2);
  4330.     p -> right_expression      = (AstExpression *) Sym(3);
  4331.     Sym(1) = p;
  4332. }
  4333. ./
  4334.  
  4335. RelationalExpression ::= RelationalExpression '>'  ShiftExpression
  4336. \:$action:\
  4337. /.$location
  4338. void Parser::Act$rule_number(void)
  4339. {
  4340.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::GREATER);
  4341.     p -> left_expression       = (AstExpression *) Sym(1);
  4342.     p -> binary_operator_token = Token(2);
  4343.     p -> right_expression      = (AstExpression *) Sym(3);
  4344.     Sym(1) = p;
  4345. }
  4346. ./
  4347.  
  4348. RelationalExpression ::= RelationalExpression '<=' ShiftExpression
  4349. \:$action:\
  4350. /.$location
  4351. void Parser::Act$rule_number(void)
  4352. {
  4353.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::LESS_EQUAL);
  4354.     p -> left_expression       = (AstExpression *) Sym(1);
  4355.     p -> binary_operator_token = Token(2);
  4356.     p -> right_expression      = (AstExpression *) Sym(3);
  4357.     Sym(1) = p;
  4358. }
  4359. ./
  4360.  
  4361. RelationalExpression ::= RelationalExpression '>=' ShiftExpression
  4362. \:$action:\
  4363. /.$location
  4364. void Parser::Act$rule_number(void)
  4365. {
  4366.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::GREATER_EQUAL);
  4367.     p -> left_expression       = (AstExpression *) Sym(1);
  4368.     p -> binary_operator_token = Token(2);
  4369.     p -> right_expression      = (AstExpression *) Sym(3);
  4370.     Sym(1) = p;
  4371. }
  4372. ./
  4373.  
  4374. RelationalExpression ::= RelationalExpression 'instanceof' ReferenceType
  4375. \:$action:\
  4376. /.$location
  4377. void Parser::Act$rule_number(void)
  4378. {
  4379.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::INSTANCEOF);
  4380.     p -> left_expression       = (AstExpression *) Sym(1);
  4381.     p -> binary_operator_token = Token(2);
  4382.     p -> right_expression      = ast_pool -> NewTypeExpression(Sym(3));
  4383.     Sym(1) = p;
  4384. }
  4385. ./
  4386.  
  4387. EqualityExpression -> RelationalExpression
  4388. \:$NoAction:\
  4389. /.$shared_NoAction./
  4390.  
  4391. EqualityExpression ::= EqualityExpression '==' RelationalExpression
  4392. \:$action:\
  4393. /.$location
  4394. void Parser::Act$rule_number(void)
  4395. {
  4396.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::EQUAL_EQUAL);
  4397.     p -> left_expression       = (AstExpression *) Sym(1);
  4398.     p -> binary_operator_token = Token(2);
  4399.     p -> right_expression      = (AstExpression *) Sym(3);
  4400.     Sym(1) = p;
  4401. }
  4402. ./
  4403.  
  4404. EqualityExpression ::= EqualityExpression '!=' RelationalExpression
  4405. \:$action:\
  4406. /.$location
  4407. void Parser::Act$rule_number(void)
  4408. {
  4409.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::NOT_EQUAL);
  4410.     p -> left_expression       = (AstExpression *) Sym(1);
  4411.     p -> binary_operator_token = Token(2);
  4412.     p -> right_expression      = (AstExpression *) Sym(3);
  4413.     Sym(1) = p;
  4414. }
  4415. ./
  4416.  
  4417.  
  4418. AndExpression -> EqualityExpression
  4419. \:$NoAction:\
  4420. /.$shared_NoAction./
  4421.  
  4422. AndExpression ::= AndExpression '&' EqualityExpression
  4423. \:$action:\
  4424. /.$location
  4425. void Parser::Act$rule_number(void)
  4426. {
  4427.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::AND);
  4428.     p -> left_expression       = (AstExpression *) Sym(1);
  4429.     p -> binary_operator_token = Token(2);
  4430.     p -> right_expression      = (AstExpression *) Sym(3);
  4431.     Sym(1) = p;
  4432. }
  4433. ./
  4434.  
  4435. ExclusiveOrExpression -> AndExpression
  4436. \:$NoAction:\
  4437. /.$shared_NoAction./
  4438.  
  4439. ExclusiveOrExpression ::= ExclusiveOrExpression '^' AndExpression
  4440. \:$action:\
  4441. /.$location
  4442. void Parser::Act$rule_number(void)
  4443. {
  4444.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::XOR);
  4445.     p -> left_expression       = (AstExpression *) Sym(1);
  4446.     p -> binary_operator_token = Token(2);
  4447.     p -> right_expression      = (AstExpression *) Sym(3);
  4448.     Sym(1) = p;
  4449. }
  4450. ./
  4451.  
  4452. InclusiveOrExpression -> ExclusiveOrExpression
  4453. \:$NoAction:\
  4454. /.$shared_NoAction./
  4455.  
  4456. InclusiveOrExpression ::= InclusiveOrExpression '|' ExclusiveOrExpression
  4457. \:$action:\
  4458. /.$location
  4459. void Parser::Act$rule_number(void)
  4460. {
  4461.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::IOR);
  4462.     p -> left_expression       = (AstExpression *) Sym(1);
  4463.     p -> binary_operator_token = Token(2);
  4464.     p -> right_expression      = (AstExpression *) Sym(3);
  4465.     Sym(1) = p;
  4466. }
  4467. ./
  4468.  
  4469. ConditionalAndExpression -> InclusiveOrExpression
  4470. \:$NoAction:\
  4471. /.$shared_NoAction./
  4472.  
  4473. ConditionalAndExpression ::= ConditionalAndExpression '&&' InclusiveOrExpression
  4474. \:$action:\
  4475. /.$location
  4476. void Parser::Act$rule_number(void)
  4477. {
  4478.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::AND_AND);
  4479.     p -> left_expression       = (AstExpression *) Sym(1);
  4480.     p -> binary_operator_token = Token(2);
  4481.     p -> right_expression      = (AstExpression *) Sym(3);
  4482.     Sym(1) = p;
  4483. }
  4484. ./
  4485.  
  4486. ConditionalOrExpression -> ConditionalAndExpression
  4487. \:$NoAction:\
  4488. /.$shared_NoAction./
  4489.  
  4490. ConditionalOrExpression ::= ConditionalOrExpression '||' ConditionalAndExpression
  4491. \:$action:\
  4492. /.$location
  4493. void Parser::Act$rule_number(void)
  4494. {
  4495.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::OR_OR);
  4496.     p -> left_expression       = (AstExpression *) Sym(1);
  4497.     p -> binary_operator_token = Token(2);
  4498.     p -> right_expression      = (AstExpression *) Sym(3);
  4499.     Sym(1) = p;
  4500. }
  4501. ./
  4502.  
  4503. ConditionalExpression -> ConditionalOrExpression
  4504. \:$NoAction:\
  4505. /.$shared_NoAction./
  4506.  
  4507. ConditionalExpression ::= ConditionalOrExpression '?' Expression ':' ConditionalExpression
  4508. \:$action:\
  4509. /.$location
  4510. void Parser::Act$rule_number(void)
  4511. {
  4512.     AstConditionalExpression *p = ast_pool -> NewConditionalExpression();
  4513.     p -> test_expression  = (AstExpression *) Sym(1);
  4514.     p -> question_token   = Token(2);
  4515.     p -> true_expression  = (AstExpression *) Sym(3);
  4516.     p -> colon_token      = Token(4);
  4517.     p -> false_expression = (AstExpression *) Sym(5);
  4518.     Sym(1) = p;
  4519. }
  4520. ./
  4521.  
  4522. AssignmentExpression -> ConditionalExpression
  4523. \:$NoAction:\
  4524. /.$shared_NoAction./
  4525.  
  4526. AssignmentExpression -> Assignment
  4527. \:$NoAction:\
  4528. /.$shared_NoAction./
  4529.  
  4530. Assignment ::= LeftHandSide AssignmentOperator AssignmentExpression
  4531. \:$action:\
  4532. /.$location
  4533. void Parser::Act$rule_number(void)
  4534. {
  4535.     AstAssignmentExpression *p = (AstAssignmentExpression *) Sym(2);
  4536.     p -> left_hand_side = (AstExpression *) Sym(1);
  4537.     p -> expression     = (AstExpression *) Sym(3);
  4538.     Sym(1) = p;
  4539. }
  4540. ./
  4541.  
  4542. LeftHandSide -> Name
  4543. \:$NoAction:\
  4544. /.$shared_NoAction./
  4545.  
  4546. LeftHandSide -> FieldAccess
  4547. \:$NoAction:\
  4548. /.$shared_NoAction./
  4549.  
  4550. LeftHandSide -> ArrayAccess
  4551. \:$NoAction:\
  4552. /.$shared_NoAction./
  4553.  
  4554. AssignmentOperator ::= '='
  4555. \:$action:\
  4556. /.$location
  4557. void Parser::Act$rule_number(void)
  4558. {
  4559.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::EQUAL, Token(1));
  4560. }
  4561. ./
  4562.  
  4563. AssignmentOperator ::= '*='
  4564. \:$action:\
  4565. /.$location
  4566. void Parser::Act$rule_number(void)
  4567. {
  4568.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::STAR_EQUAL, Token(1));
  4569. }
  4570. ./
  4571.  
  4572. AssignmentOperator ::= '/='
  4573. \:$action:\
  4574. /.$location
  4575. void Parser::Act$rule_number(void)
  4576. {
  4577.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::SLASH_EQUAL, Token(1));
  4578. }
  4579. ./
  4580.  
  4581. AssignmentOperator ::= '%='
  4582. \:$action:\
  4583. /.$location
  4584. void Parser::Act$rule_number(void)
  4585. {
  4586.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::MOD_EQUAL, Token(1));
  4587. }
  4588. ./
  4589.  
  4590. AssignmentOperator ::= '+='
  4591. \:$action:\
  4592. /.$location
  4593. void Parser::Act$rule_number(void)
  4594. {
  4595.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::PLUS_EQUAL, Token(1));
  4596. }
  4597. ./
  4598.  
  4599. AssignmentOperator ::= '-='
  4600. \:$action:\
  4601. /.$location
  4602. void Parser::Act$rule_number(void)
  4603. {
  4604.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::MINUS_EQUAL, Token(1));
  4605. }
  4606. ./
  4607.  
  4608. AssignmentOperator ::= '<<='
  4609. \:$action:\
  4610. /.$location
  4611. void Parser::Act$rule_number(void)
  4612. {
  4613.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::LEFT_SHIFT_EQUAL, Token(1));
  4614. }
  4615. ./
  4616.  
  4617. AssignmentOperator ::= '>>='
  4618. \:$action:\
  4619. /.$location
  4620. void Parser::Act$rule_number(void)
  4621. {
  4622.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::RIGHT_SHIFT_EQUAL, Token(1));
  4623. }
  4624. ./
  4625.  
  4626. AssignmentOperator ::= '>>>='
  4627. \:$action:\
  4628. /.$location
  4629. void Parser::Act$rule_number(void)
  4630. {
  4631.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::UNSIGNED_RIGHT_SHIFT_EQUAL, Token(1));
  4632. }
  4633. ./
  4634.  
  4635. AssignmentOperator ::= '&='
  4636. \:$action:\
  4637. /.$location
  4638. void Parser::Act$rule_number(void)
  4639. {
  4640.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::AND_EQUAL, Token(1));
  4641. }
  4642. ./
  4643.  
  4644. AssignmentOperator ::= '^='
  4645. \:$action:\
  4646. /.$location
  4647. void Parser::Act$rule_number(void)
  4648. {
  4649.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::XOR_EQUAL, Token(1));
  4650. }
  4651. ./
  4652.  
  4653. AssignmentOperator ::= '|='
  4654. \:$action:\
  4655. /.$location
  4656. void Parser::Act$rule_number(void)
  4657. {
  4658.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::IOR_EQUAL, Token(1));
  4659. }
  4660. ./
  4661.  
  4662. Expression -> AssignmentExpression
  4663. \:$NoAction:\
  4664. /.$shared_NoAction./
  4665.  
  4666. ConstantExpression -> Expression
  4667. \:$NoAction:\
  4668. /.$shared_NoAction./
  4669.  
  4670. ---------------------------------------------------------------------------------------
  4671. --
  4672. -- The following rules are for optional nonterminals.
  4673. --
  4674. ---------------------------------------------------------------------------------------
  4675.  
  4676. PackageDeclarationopt ::= $empty
  4677. \:$NullAction:\
  4678. /.$location
  4679. //
  4680. // Given a rule of the form A ::= x1 x2 ... xn
  4681. //
  4682. // Construct a NULL Ast for A.
  4683. //
  4684. void Parser::NullAction(void) { Sym(1) = NULL; }
  4685. ./
  4686.  
  4687. PackageDeclarationopt -> PackageDeclaration
  4688. \:$NoAction:\
  4689. /.$shared_NoAction./
  4690.  
  4691. Superopt ::= $empty
  4692. \:$NullAction:\
  4693. /.$shared_NullAction./
  4694.  
  4695. Superopt -> Super
  4696. \:$NoAction:\
  4697. /.$shared_NoAction./
  4698.  
  4699. Expressionopt ::= $empty
  4700. \:$NullAction:\
  4701. /.$shared_NullAction./
  4702.  
  4703. Expressionopt -> Expression
  4704. \:$NoAction:\
  4705. /.$shared_NoAction./
  4706.  
  4707. --1.1 feature
  4708. ClassBodyopt ::= $empty
  4709. \:$NullAction:\
  4710. /.$shared_NullAction./
  4711.  
  4712. --1.1 feature
  4713. ClassBodyopt -> ClassBody
  4714. \:$NoAction:\
  4715. /.$shared_NoAction./
  4716.  
  4717. ---------------------------------------------------------------------------------------
  4718. --
  4719. -- The rules below are for optional terminal symbols.  An optional comma,
  4720. -- is only used in the context of an array initializer - It is a
  4721. -- "syntactic sugar" that otherwise serves no other purpose. By contrast,
  4722. -- an optional identifier is used in the definition of a break and 
  4723. -- continue statement. When the identifier does not appear, a NULL
  4724. -- is produced. When the identifier is present, the user should use the
  4725. -- corresponding Token(i) method. See break statement as an example.
  4726. --
  4727. ---------------------------------------------------------------------------------------
  4728.  
  4729. ,opt ::= $empty
  4730. \:$NullAction:\
  4731. /.$shared_NullAction./
  4732.  
  4733. ,opt -> ,
  4734. \:$NoAction:\
  4735. /.$shared_NoAction./
  4736.  
  4737. ImportDeclarationsopt ::= $empty
  4738. \:$NullAction:\
  4739. /.$shared_NullAction./
  4740.  
  4741. ImportDeclarationsopt -> ImportDeclarations
  4742. \:$NoAction:\
  4743. /.$shared_NoAction./
  4744.  
  4745. TypeDeclarationsopt ::= $empty
  4746. \:$NullAction:\
  4747. /.$shared_NullAction./
  4748.  
  4749. TypeDeclarationsopt -> TypeDeclarations
  4750. \:$NoAction:\
  4751. /.$shared_NoAction./
  4752.  
  4753. ClassBodyDeclarationsopt ::= $empty
  4754. \:$NullAction:\
  4755. /.$shared_NullAction./
  4756.  
  4757. ClassBodyDeclarationsopt -> ClassBodyDeclarations
  4758. \:$NoAction:\
  4759. /.$shared_NoAction./
  4760.  
  4761. Modifiersopt ::= $empty
  4762. \:$NullAction:\
  4763. /.$shared_NullAction./
  4764.  
  4765. Modifiersopt -> Modifiers
  4766. \:$NoAction:\
  4767. /.$shared_NoAction./
  4768.  
  4769. BlockStatementsopt ::= $empty
  4770. \:$NullAction:\
  4771. /.$shared_NullAction./
  4772.  
  4773. BlockStatementsopt -> BlockStatements
  4774. \:$NoAction:\
  4775. /.$shared_NoAction./
  4776.  
  4777. Dimsopt ::= $empty
  4778. \:$NullAction:\
  4779. /.$shared_NullAction./
  4780.  
  4781. Dimsopt -> Dims
  4782. \:$NoAction:\
  4783. /.$shared_NoAction./
  4784.  
  4785. ArgumentListopt ::= $empty
  4786. \:$NullAction:\
  4787. /.$shared_NullAction./
  4788.  
  4789. ArgumentListopt -> ArgumentList
  4790. \:$NoAction:\
  4791. /.$shared_NoAction./
  4792.  
  4793. Throwsopt ::= $empty
  4794. \:$NullAction:\
  4795. /.$shared_NullAction./
  4796.  
  4797. Throwsopt -> Throws
  4798. \:$NoAction:\
  4799. /.$shared_NoAction./
  4800.  
  4801. FormalParameterListopt ::= $empty
  4802. \:$NullAction:\
  4803. /.$shared_NullAction./
  4804.  
  4805. FormalParameterListopt -> FormalParameterList
  4806. \:$NoAction:\
  4807. /.$shared_NoAction./
  4808.  
  4809. Interfacesopt ::= $empty
  4810. \:$NullAction:\
  4811. /.$shared_NullAction./
  4812.  
  4813. Interfacesopt -> Interfaces
  4814. \:$NoAction:\
  4815. /.$shared_NoAction./
  4816.  
  4817. InterfaceMemberDeclarationsopt ::= $empty
  4818. \:$NullAction:\
  4819. /.$shared_NullAction./
  4820.  
  4821. InterfaceMemberDeclarationsopt -> InterfaceMemberDeclarations
  4822. \:$NoAction:\
  4823. /.$shared_NoAction./
  4824.  
  4825. ForInitopt ::= $empty
  4826. \:$NullAction:\
  4827. /.$shared_NullAction./
  4828.  
  4829. ForInitopt -> ForInit
  4830. \:$NoAction:\
  4831. /.$shared_NoAction./
  4832.  
  4833. ForUpdateopt ::= $empty
  4834. \:$NullAction:\
  4835. /.$shared_NullAction./
  4836.  
  4837. ForUpdateopt -> ForUpdate
  4838. \:$NoAction:\
  4839. /.$shared_NoAction./
  4840.  
  4841. ExtendsInterfacesopt ::= $empty
  4842. \:$NullAction:\
  4843. /.$shared_NullAction./
  4844.  
  4845. ExtendsInterfacesopt -> ExtendsInterfaces
  4846. \:$NoAction:\
  4847. /.$shared_NoAction./
  4848.  
  4849. Catchesopt ::= $empty
  4850. \:$NullAction:\
  4851. /.$shared_NullAction./
  4852.  
  4853. Catchesopt -> Catches
  4854. \:$NoAction:\
  4855. /.$shared_NoAction./
  4856.  
  4857. PackageHeaderMarker ::= $empty
  4858. \:$action:\
  4859. /.$location
  4860. //
  4861. // When this function is invoked, if the "parse_package_header_only" flag
  4862. // is turned on, we skip to the end-of-file token.
  4863. //
  4864. void Parser::Act$rule_number(void)
  4865. {
  4866.     if (parse_package_header_only)
  4867.         lex_stream -> Reset(lex_stream -> NumTokens() - 1); // point to the EOF token
  4868.     Sym(1) = NULL;
  4869. }
  4870. ./
  4871.  
  4872. MethodHeaderMarker ::= $empty
  4873. \:$action:\
  4874. /.$location
  4875. //
  4876. // When this function is invoked, if the "parse_header_only" flag
  4877. // is turned on, the body of the method being parsed is skipped.
  4878. //
  4879. void Parser::Act$rule_number(void)
  4880. {
  4881.     if (parse_header_only)
  4882.     {
  4883.         TokenObject token = Token(1);
  4884.  
  4885.         //
  4886.         // If the first token immediately following the method header
  4887.         // is not an open brace, then we have a syntactic error. Do
  4888.         // nothing and let the error recovery take care of it.
  4889.         //
  4890.         if (lex_stream -> Kind(token) == TK_LBRACE)
  4891.             lex_stream -> Reset(lex_stream -> MatchingBrace(token));
  4892.     }
  4893.  
  4894.     Sym(1) = NULL;
  4895. }
  4896. ./
  4897.  
  4898. ---------------------------------------------------------------------------------------
  4899.  
  4900. \:
  4901. #ifndef HEADERS
  4902.     return;
  4903. }
  4904. #endif
  4905. :\
  4906.  
  4907. $names
  4908.  
  4909. BodyMarker ::= '"class Identifier { ... MethodHeader "'
  4910.  
  4911. void ::= ResultType
  4912.  
  4913. PLUS_PLUS ::=    '++'   
  4914. MINUS_MINUS ::=    '--'   
  4915. EQUAL_EQUAL ::=    '=='   
  4916. LESS_EQUAL ::=    '<='   
  4917. GREATER_EQUAL ::=    '>='   
  4918. NOT_EQUAL ::=    '!='   
  4919. LEFT_SHIFT ::=    '<<'   
  4920. RIGHT_SHIFT ::=    '>>'   
  4921. UNSIGNED_RIGHT_SHIFT ::=    '>>>'  
  4922. PLUS_EQUAL ::=    '+='   
  4923. MINUS_EQUAL ::=    '-='   
  4924. MULTIPLY_EQUAL ::=    '*='   
  4925. DIVIDE_EQUAL ::=    '/='   
  4926. AND_EQUAL ::=    '&='   
  4927. OR_EQUAL ::=    '|='   
  4928. XOR_EQUAL ::=    '^='   
  4929. REMAINDER_EQUAL ::=    '%='   
  4930. LEFT_SHIFT_EQUAL ::=    '<<='  
  4931. RIGHT_SHIFT_EQUAL ::=    '>>='  
  4932. UNSIGNED_RIGHT_SHIFT_EQUAL ::=    '>>>=' 
  4933. OR_OR ::=    '||'   
  4934. AND_AND ::=    '&&'   
  4935.  
  4936. PLUS ::=    '+'    
  4937. MINUS ::=    '-'    
  4938. NOT ::=    '!'    
  4939. REMAINDER ::=    '%'    
  4940. XOR ::=    '^'    
  4941. AND ::=    '&'    
  4942. MULTIPLY ::=    '*'    
  4943. OR ::=    '|'    
  4944. TWIDDLE ::=    '~'    
  4945. DIVIDE ::=    '/'    
  4946. GREATER ::=    '>'    
  4947. LESS ::=    '<'    
  4948. LPAREN ::=    '('    
  4949. RPAREN ::=    ')'    
  4950. LBRACE ::=    '{'    
  4951. RBRACE ::=    '}'    
  4952. LBRACKET ::=    '['    
  4953. RBRACKET ::=    ']'    
  4954. SEMICOLON ::=    ';'    
  4955. QUESTION ::=    '?'    
  4956. COLON ::=    ':'    
  4957. COMMA ::=    ','    
  4958. DOT ::=    '.'    
  4959. EQUAL ::=    '='    
  4960.  
  4961. $end
  4962.